You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:07:30