r - 根据给定变量识别连续序列
问题描述
我真的坚持这一点。具有以下df1
变量:
serial
= 一群人id1
= 组中的人(例如12 (serial) 1 (id1)
=group12 person 1; 12 2 = group 12 person 2, etc
. )'Day
'当第一次(或开始)录音时。
这些天由相同数量的观察组成(例如 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
我想确定连续记录(每日记录之间没有差距)和记录总数。
连续记录的开始日期是“Day”变量。例如,连续记录将是序列号 12。记录从星期一开始,并且在一周内有记录(至少有一个来自 95 变量)。在一周内(7 x 95 变量)有 11 条记录
不连续的记录将是 id 123,因为在第 3 天和第 6 天有一个间隔日。记录从周二开始,周三和周六有间隔。
最后我想记录下连续录音的持续时间。
样本输出:
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")
类似的帖子R - 识别连续序列
解决方案
我们可以使用rleid
fromdata.table
来获得正确的 'Occurance'
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
推荐阅读
- c# - 将多个从 XML 创建的属性和/或类转换为 Visual Studio 中的自动属性
- haskell - 对包含单个元素和列表的列表进行 Fmap
- xcode - Xcode:无法加载 Info.plist 异常 (eGPUOverrides)
- amazon-web-services - AWS Lambda - 存储队列状态
- r - 在 ggplot2 中进行分面时仅保留 som 组
- tensorflow - 如何使用张量板将我的训练和验证准确性合并到一张图中
- apache-spark - 如何在 Spark 中设置“映射器”/分区的数量
- tizen - 三星 Tizen TV 中的浏览器回调
- verilog - 16 位 CPU 设计:实现获取执行周期的问题
- testing - Python 动态测试计划生成