我真的被困在这上面了。df1有以下变量:
serial =人群id1 =该群体中的人(如。12 (serial) 1 (id1) =群12 person 1; 12 2 = group 12 person 2, etc.) 'Day'when第一次(或开始)录音已经完成。日数为相同数目的观察(例如95)
day1 (Monday) = day11-day196
day2 (Tuesday) = day21-day296
day3 (Wednesday) = day31-day396
day4 (Thursday) = day41-day496
day5 (Friday) = day51-day596
day6 (Saturday) = day61-day696
day7 (Sunday) = day71-day796 df1实例
serial id1 Day day1 day2 day3 day4 day5 day6 day7
12 1 Monday 2 1 2 1 1 3 1
123 1 Tuesday 0 3 0 3 3 0 3
10 1 Wednesday 0 3 3 3 3 3 3我想指出连续的记录(每天的记录之间没有差距)和记录的总数。
连续录音的起始日是“日”变量。例如,连续记录为12次。记录开始于周一,每周至少有一次记录(从95个变量中至少有一个)。在这一周期间(7x95变量)记录了11个记录。
一个非连续的记录将是id 123,因为在day3和day6上有一个间隙日。纪录从周二开始,周三和周六有空档。
最后,我想记录一下连续录音的持续时间。
样本输出:
serial id1 Duration Occurance Days
12 1 11 7 day1 day2 day3 day4 day5 day6 day7
123 1 12 0 0
10 1 18 5 day3 day4 day5 day6 day7样本数据
structure(list(serial = c(12, 123, 10), id1 = c(1, 1, 1), Day = structure(1:3, .Label = c("Monday",
"Tuesday", "Wednesday"), class = "factor"), day1 = c(2, 0, 0),
day2 = c(1, 3, 3), day3 = c(2, 0, 3), day4 = c(1, 3, 3),
day5 = c(1, 3, 3), day6 = c(3, 0, 3), day7 = c(1, 3, 3)), row.names = c(NA,
3L), class = "data.frame")发布于 2020-04-13 23:20:21
我们可以使用rleid从data.table得到‘发生’的正确。
library(data.table)
wkdays <- c("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
out1 <- do.call(rbind, Map(function(x, y) {
i1 <- match(y, wkdays): length(x)
i2 <- x[i1] != 0
i3 <- all(i2)
grp1 <- rleid(i2)
Days <- if(i3) tapply(names(x)[i1][i2], grp1[i2], FUN = paste, collapse= ' ') else ''
Occurance <- if(i3) length(grp1[i2]) else 0
data.frame(Occurance, Days)
}, asplit(df[-(1:3)], 1), df$Day))
out1$Duration <- rowSums(df1[startsWith(names(df1), 'day')])
out1
# Occurance Days Duration
#1 7 day1 day2 day3 day4 day5 day6 day7 11
#2 0 12
#3 5 day3 day4 day5 day6 day7 18发布于 2020-04-13 12:29:29
你可以利用lead和lag of dplyr,
我试过了,结果是:
library(dplyr)
df %>%
select(serial, contains("day", ignore.case = FALSE)) %>%
group_by(serial) %>%
tidyr::gather(day, val, -serial) %>%
# convert to binary
mutate(occur = ifelse(val > 0, 1, 0)) %>%
# if detect a seq, add cumulative, else 0
mutate(cums = ifelse(lead(occur) > 0 & lag(occur) > 0 & occur > 0,
occur + cumsum(occur), 0)) %>%
summarise(occurance = max(cums, na.rm = T), duration = sum(val))# A tibble: 3 x 3
serial occurance duration
<dbl> <dbl> <dbl>
1 10 6 18
2 12 7 11
3 123 0 12https://stackoverflow.com/questions/61187493
复制相似问题