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
相关产品推荐
相关产品推荐

