Рассчитать длину строки в кадре данных - PullRequest
2 голосов
/ 09 апреля 2020

Я хотел бы определить общее количество времени, сообщаемое идентификатором от t1 до t7. T1, который записывает возникновение активности в течение дня1 на разных временных шагах, таких как t1_1, t1_2, t1_3 и так далее. Я заинтересован только в последовательных w днях. Последовательный день означает, что идентификатор сообщил об активности в t1 и t2; нет последовательных означает активность, сообщенную в течение t1 и t3. Я хотел бы идентифицировать идентификаторы, которые сообщали об активности от t1 до t7, а также количество сообщенного времени

Вход:

id t1_1 t1_2 t1_3 t2_1 t2_2 t2_3 t3_1 t3_2 t3_3 t4_1 t4_2 t4_3 t5_1 t5_2 t5_3 t6_1 t6_2 t6_3 t7_1 t7_2 t7_3
12  0    1     1    0     1   0    1    0    1    0    1    0    0    1    0     1   1     1   0      0  1
123 0    0     0    1     1   1    0    0    0    1    1    1    1    1    1     0   0     0    1     1  1
 10  1   1     1    1     1    1    1   1    1    1    1    1    1    1    1     1   1     1    1     1  1   

Выход для идентификатора 12

Id   Duration  
12        11                  
10        21

Одним из способов обозначить это является использование биокондуктора, подкладка данных на ежедневный уровень, но есть ли лучшее решение?

Образец данных

df1 <- structure(list(id = c(12L, 123L, 10L), t1_1 = c(0L, 0L, 1L), 
            t1_2 = c(1L, 0L, 1L), t1_3 = c(1L, 0L, 1L), t2_1 = c(0L, 
            1L, 1L), t2_2 = c(1L, 1L, 1L), t2_3 = c(0L, 1L, 1L), t3_1 = c(1L, 
            0L, 1L), t3_2 = c(0L, 0L, 1L), t3_3 = c(1L, 0L, 1L), t4_1 = c(0L, 
            1L, 1L), t4_2 = c(1L, 1L, 1L), t4_3 = c(0L, 1L, 1L), t5_1 = c(0L, 
            1L, 1L), t5_2 = c(1L, 1L, 1L), t5_3 = c(0L, 1L, 1L), t6_1 = c(1L, 
            0L, 1L), t6_2 = c(1L, 0L, 1L), t6_3 = c(1L, 0L, 1L), t7_1 = c(0L, 
            1L, 1L), t7_2 = c(0L, 1L, 1L), t7_3 = c(1L, 1L, 1L)), 
            class = "data.frame", row.names = c(NA, 
        -3L))

1 Ответ

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

У меня есть решение с data.table, но то же самое может быть достигнуто с dplyr. Сначала я частично преобразовываю в длинный формат:

library(data.table)
df1 <- setDT(df1)
df2 <- melt(df1,measure.vars = patterns(paste0("t",1:7)),variable.name = "time",value.name = paste0("day",1:7))

    id time day1 day2 day3 day4 day5 day6 day7
1:  12    1    0    0    1    0    0    1    0
2: 123    1    0    1    0    1    1    0    1
3:  10    1    1    1    1    1    1    1    1
4:  12    2    1    1    0    1    1    1    0
5: 123    2    0    1    0    1    1    0    1
6:  10    2    1    1    1    1    1    1    1
7:  12    3    1    0    1    0    0    1    1
8: 123    3    0    1    0    1    1    0    1
9:  10    3    1    1    1    1    1    1    1

Затем я суммирую время по дням:

df3 <- df2[,lapply(.SD,sum),.SDcols = paste0("day",1:7),by = .(id)]

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

Продолжительность можно определить с помощью функции apply, объединяющей ваше условие, что ни один день не должен Работали 0 раз:

duration <- apply(df3[,-"id"],1,function(x){if(all(x>0)){sum(x)}else{NA}}) %>% unlist()
output <- data.frame(id = df3$id[!is.na(duration)],duration = na.omit(duration))

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