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

dplyr group_by分组后用grepl获取参与者首次切换偏好的日期与研究日

分组计算参与者首次切换食物偏好的研究日及对应日期

首先定义原始数据框:

df <- data.frame(participant = c(1,1,1,2,2,2,2),
               food = c("pizza", "turkey", "turkey", "pizza", "pizza", "pizza", "turkey"),
               date = c("2012-01-01", "2012-01-02", "2012-01-03","2012-01-01", "2012-01-02", "2012-01-03", "2012-01-04"))

需求说明

需要为每个参与者新增两个变量:

  • study_day:首次切换偏好至turkey的研究日(即该记录在对应参与者分组内的行号)
  • change_date:首次切换偏好至turkey对应的日期

期望的结果数据框如下:

df2 <- data.frame(participant = c(1,1,1,2,2,2,2),
                  food = c("pizza", "turkey", "turkey", "pizza", "pizza", "pizza", "turkey"),
                  date = c("2012-01-01", "2012-01-02", "2012-01-03","2012-01-01", "2012-01-02", "2012-01-03", "2012-01-04"),
                 study_day = c(2,2,2,4,4,4,4),
                 change_date = c("2012-01-02","2012-01-02","2012-01-02","2012-01-04","2012-01-04","2012-01-04","2012-01-04"))

错误原因

之前的代码中使用了df$food和df$date,这会直接调用整个原始数据框的列,完全忽略了group_by(participant)的分组逻辑,导致结果是全局范围内第一个turkey的记录,而非每个参与者分组内的结果。

正确解决方案

去掉df$前缀,直接引用分组内的变量即可,以下提供两种可行写法:

写法一:使用which()定位

library(dplyr)

df %>% 
  group_by(participant) %>% 
  mutate(
    study_day = which(food == "turkey")[1],
    change_date = date[which(food == "turkey")[1]]
  ) %>% 
  ungroup() # 可选,用于取消分组状态

写法二:使用first()和row_number()简化

library(dplyr)

df %>% 
  group_by(participant) %>% 
  mutate(
    study_day = row_number()[food == "turkey"][1],
    change_date = first(date[food == "turkey"])
  ) %>% 
  ungroup()

两种写法均能生成符合预期的结果,确保每个参与者的study_day和change_date对应自身首次切换至turkey的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:01:20