如何用tidyr或dplyr统计事件间各转换组合的实例数?
用dplyr统计事件序列的转换次数
当然可以用dplyr轻松实现,完全不用写循环,步骤清晰高效:
首先加载dplyr包:
library(dplyr)
然后对现有数据做处理:
existing_df <- data.frame (person = c("john", "john", "jane","jane","jane"), event = c("skate", "sit", "walk","skate","sit"), sequenceNum = c(1,2,1,2,3) ) result_df <- existing_df %>% # 按人员分组,确保只在同一个人的事件序列里计算转换关系 group_by(person) %>% # 用lead()函数获取当前事件的下一个事件,作为目标事件 mutate(target = lead(event)) %>% # 过滤掉每个人员序列的最后一行(没有后续事件,target为NA) filter(!is.na(target)) %>% # 按源事件和目标事件分组,统计转换次数 group_by(event, target) %>% summarise(value = n(), .groups = "drop") %>% # 把event列重命名为source,匹配目标格式 rename(source = event) print(result_df)
运行后得到的结果和你想要的desired_df完全一致:
# A tibble: 2 × 3 source target value <chr> <chr> <int> 1 skate sit 2 2 walk skate 1
每一步的逻辑:
- 先按人员分组,保证转换关系只在同一个人的事件序列内计算
lead()是dplyr的窗口函数,专门用来取同组内下一行的值,正好对应事件的“下一步”- 过滤NA是因为每个序列的最后一个事件没有后续,不需要统计
- 最后按源事件和目标事件分组计数,就得到了各转换的次数
内容的提问来源于stack exchange,提问作者Marion
相关产品推荐
相关产品推荐

