Eu tenho o seguinte conjunto de dados:
>dput(df)
structure(list(Author = c("hitham", "Ow", "WPJ4", "Seb", "Karen", "Ow", "Ow", "hitham", "Sarah",
"Rene"), diff = structure(c(28, 2, 8, 3, 7, 8, 11, 1, 4, 8), class = "difftime", units = "secs")),
row.names = 1:10, class = "data.frame")
Como podemos ver, o autor Ow
aparece três vezes e o autor hitham
duas vezes:
Author diff
1 hitham 28 secs
2 Ow 2 secs
3 WPJ4 8 secs
4 Seb 3 secs
5 Karen 7 secs
6 Ow 8 secs
7 Ow 11 secs
8 hitham 1 secs
9 Sarah 4 secs
10 Rene 8 secs
Essas linhas representam algumas atividades realizadas pelos autores. Por exemplo, hitham
realiza sua atividade após 1 seg e depois de 18 seg no segundo tempo.
Gostaria de ter certeza de que há pelo menos 10 segundos entre uma atividade e outra.
Gostaria de excluir as atividades (linhas) que não atendem a esse requisito. Por exemplo, Ow
executa sua atividade após 2 segundos e, em seguida, após 8 segundos: o último deve ser excluído. O resultado desejado é então:
Author diff
1 hitham 28 secs
2 Ow 2 secs
3 WPJ4 8 secs
4 Seb 3 secs
5 Karen 7 secs
6 Ow 11 secs
7 hitham 1 secs
8 Sarah 4 secs
9 Rene 8 secs
Editar . Acrescento isso na esperança de ser mais claro. Vamos considerar hitham
. Se considerarmos as hitham
linhas (classificadas por diff
campo):
hitham 1 secs
hitham 28 secs
Nós temos isso (28-1)+1>10
, então não há necessidade de deletar nenhum deles.
Vamos agora considerar Ow
.
Ow 2 secs
Ow 8 secs
Ow 11 secs
As diferenças em segundos entre as linhas consecutivas são (consulte a última coluna):
Ow 2 secs -
Ow 8 secs 7
Ow 11 secs 4
O resultado desejado pode ser obtido apagando a primeira linha que mostra na última coluna um número menor que 10. Na verdade:
Ow 2 secs -
Ow 11 secs 10
Não precisamos deletar a última linha porque a diferença aqui é apenas 10.
Com base nessa resposta, você pode tentar uma abordagem recursiva.
library(dplyr)
my_fun <- function(d, ind = 1) {
ind.next <- first(which(d - d[ind] >= 9))
if (length(ind.next) == 0)
return(ind)
else
return(c(ind, my_fun(d, ind.next)))
}
df %>%
group_by(Author) %>%
arrange(diff) %>%
slice(my_fun(diff))
Cada vez na função, ela identifica o próximo índice ind.next
que é o primeiro índice para o qual o diff
é maior ou igual a 9 segundos do diff
indexado por ind
. Se não houver nenhum ind.next
disponível, ele retorna ind
. Caso contrário, chame recursivamente a função novamente e concatene com ind
.
Saída
Author diff
<chr> <drtn>
1 hitham 1 secs
2 hitham 28 secs
3 Karen 7 secs
4 Ow 2 secs
5 Ow 11 secs
6 Rene 8 secs
7 Sarah 4 secs
8 Seb 3 secs
9 WPJ4 8 secs
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras