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

如何使用dplyr统计重复测量数据框中特定值后目标值的出现次数并生成指定结构结果

用dplyr实现重复测量序列的触发事件统计

当然可以用dplyr轻松搞定这个需求!我会一步步带你完成,代码逻辑清晰,最终结果完全匹配你想要的格式。

第一步:加载必要的包

首先确保你已经安装并加载了dplyr和tidyr(tidyr是tidyverse的一部分,用来转换数据格式):

library(dplyr)
library(tidyr)

第二步:核心逻辑实现

我们的思路是为每个1/2/3匹配它前面最近的4/5,再统计这些配对的出现次数,具体代码如下:

# 你的样本数据
df <- data.frame(ID = as.factor(c(1,1,1,1,2,2,2,2,3,3,3,3,3,4,4,5,5,5,5,6,6,6,6,6,6)), 
                 P1 = c(1,5,2,4,1,5,2,4,2,5,1,4,2,4,1,5,3,5,1,4,2,5,1,4,1))

# 处理并生成结果
result_df <- df %>%
  # 按个体ID分组,确保只在同一个体的序列内追踪关系
  group_by(ID) %>%
  # 标记触发值(4/5),其他值暂设为NA
  mutate(prev_trigger = ifelse(P1 %in% c(4, 5), P1, NA)) %>%
  # 向下填充NA,让每个1/2/3都对应到最近的前一个4/5
  fill(prev_trigger, .direction = "down") %>%
  # 只保留目标值(1/2/3)的行,这些是我们要统计的事件
  filter(P1 %in% c(1, 2, 3)) %>%
  # 取消分组,准备全局统计
  ungroup() %>%
  # 统计每一种(触发值→目标值)配对的次数
  count(prev_trigger, P1) %>%
  # 转换为宽表,列是触发值(Category_4/Category_5),行是目标值(1/2/3)
  pivot_wider(
    names_from = prev_trigger,
    values_from = n,
    names_prefix = "Category_",
    values_fill = 0 # 没有匹配的组合自动填0
  ) %>%
  # 按目标值1、2、3排序行
  arrange(P1) %>%
  # 将目标值设为行名,完全匹配你想要的格式
  column_to_rownames("P1")

# 查看最终结果
print(result_df)

运行结果

针对你的样本数据,运行后会得到:

Category_4 Category_5
1                  2          3
2                  2          2
3                  0          1

代码细节解释

  • group_by(ID):保证我们只在同一个体的测量序列内追踪触发值和目标值的对应关系,不会跨个体混淆数据。
  • mutate(prev_trigger = ...):把序列中的4和5标记出来,其他值暂时设为NA,方便后续填充。
  • fill(prev_trigger, .direction = "down"):向下填充NA值,这样每个1/2/3都会“继承”它前面最近的4或5作为触发值,完美对应“被中断前”的逻辑。
  • filter(P1 %in% c(1,2,3)):只保留目标值的行,因为我们只关心这些被4/5触发的事件。
  • count(prev_trigger, P1):统计每一种(触发值→目标值)配对的出现次数。
  • pivot_wider(...):把长格式的统计结果转换成你需要的宽格式,缺失的配对用0填充,避免出现空值。
  • arrange(P1)和column_to_rownames("P1"):调整行的顺序和格式,完全匹配你期望的输出样式。

内容的提问来源于stack exchange,提问作者user13069688

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:07:28