Вернуть длину строки на основе вхождения - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть фрейм данных, который записывает ежедневные случаи различных действий. Я хотел бы определить количество дней, в течение которых произошла активность в повторном порядке, и ее продолжительность. Неделя начинается с дня 1 и заканчивается днем ​​7. Например, в случае идентификатора 12 активность происходит в течение 7 дней, а продолжительность составляет 11; в случае 123 возникновение активности не является последовательным, поскольку это день разрыва (день 3 и день 6), а в случае идентификатора 10 число появлений равно 6 дням, а продолжительность - 18.

Ввод :

  id   day1 day2 day3 day4 day5 day6 day7
    12    2    1    2    1    1    3    1
   123    0    3    0    3    3    0    3
    10    0    3    3    3    3    3    3

Вывод:

id   Duration Occurance
12     11        7
123    12        0
10     18        6

Пример набора данных:

structure(list(id = c(12L, 123L, 10L), day1 = c(2L, 0L, 3L), 
    day2 = c(1L, 3L, 3L), day3 = c(2L, 0L, 3L), day4 = c(1L, 
    3L, 3L), day5 = c(1L, 3L, 3L), day6 = c(3L, 0L, 3L), day7 = c(1L, 
    3L, 3L)), row.names = c(NA, -3L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x000002a81a571ef0>)

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Используя apply по строкам:

cbind(df[, 1], t(apply(df[, -1], 1, function(x) {
   inds <- rle(x != 0)
   if(length(inds$length) <= 2)
      c(Duration = sum(x), Occurance = max(inds$lengths))
   else
      c(Duration = sum(x), Occurance = 0)
})))

#    id Duration Occurance
#1:  12       11         7
#2: 123       12         0
#3:  10       21         7

Используя rle, мы проверяем ряд из 0 и ненулевых значений, которые мы имеем. Если они меньше, чем 2, мы включаем длину максимальной длины вместе с sum значениями строки, иначе возвращаем sum с 0.

0 голосов
/ 10 апреля 2020

Именуется в датафрейме, затем используется функция rle:

out <- cbind(dat$id, t(apply(dat[, -1], 1, function(y) c(sum(y),max(rle(y>0)$lengths)))))
out <- data.frame(out)
names(out) <- c("id", "Duration", "Occurrence")
out

   id Duration Occurrence
1  12       11          7
2 123       12          2
3  10       21          7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...