如何统计data.frame中唯一连续任务组合的出现次数?
嘿,我懂你现在的困扰啦——你已经能通过循环提取连续的任务对,但卡在了把这些组合整理成统计结果这一步对吧?其实不用纠结嵌套循环,用R里的工具包就能轻松搞定,我给你两种常用的解决方案:
首先先把你的原始数据还原出来,方便后续操作:
# 你的原始数据 df <- data.frame( OBJECT = c(1,1,1,1,2,2,2,2,2), TASK = c("A", "C", "D", "E", "A", "B", "C", "D", "F") )
方案一:用dplyr(tidyverse系列)实现
这是最直观的方法,完全贴合你的需求逻辑:
library(dplyr) # 按OBJECT分组处理,生成前后任务对,再统计次数 result_df <- df %>% # 每个OBJECT的任务序列是独立的,所以先分组 group_by(OBJECT) %>% # 用lead()获取当前任务的下一个任务作为SUCCESSOR,当前任务就是PREDECESSOR mutate( SUCCESSOR = lead(TASK), PREDECESSOR = TASK ) %>% # 每个组的最后一个任务没有后继,所以过滤掉这些行 filter(!is.na(SUCCESSOR)) %>% # 取消分组,准备统计 ungroup() %>% # 按前后任务对分组,统计出现次数,命名为COUNT count(PREDECESSOR, SUCCESSOR, name = "COUNT") # 查看结果 print(result_df)
运行后你会得到和预期完全一致的结果:
# A tibble: 6 × 3 PREDECESSOR SUCCESSOR COUNT <chr> <chr> <int> 1 A B 1 2 A C 1 3 B C 1 4 C D 2 5 D E 1 6 D F 1
方案二:用data.table实现(适合大数据场景)
如果你的数据量很大,data.table的效率会更高:
library(data.table) # 把data.frame转成data.table格式 setDT(df) # 按OBJECT分组提取前后任务对,再统计次数 result_dt <- df[, .( PREDECESSOR = TASK[-.N], # 取除了最后一个元素的所有任务作为前驱 SUCCESSOR = TASK[-1] # 取除了第一个元素的所有任务作为后继 ), by = OBJECT][, .(COUNT = .N), by = .(PREDECESSOR, SUCCESSOR)] # 查看结果 print(result_dt)
为什么不推荐用for循环呢?因为嵌套循环不仅代码写起来麻烦,而且R是向量型语言,这种分组+向量操作的方式不仅更简洁,处理大数据时的效率也会高很多。
内容的提问来源于stack exchange,提问作者FabianR
相关产品推荐
相关产品推荐

