如何为按Fish_ID分组的DataFrame创建首次成功标记二进制列?
修正方案
针对你的需求,这里提供两种基于dplyr的实现方式,精准标记每组中首次出现Success=1的位置:
方法一:累计求和判断法
mydata %>% group_by(Fish_ID) %>% # 注意列名需与数据中一致(示例为Fish_ID,原代码小写会出错) mutate(First_Success = ifelse(Success == 1 & cumsum(Success) == 1, 1, 0)) %>% ungroup()
逻辑解释:
cumsum(Success)对每组内的Success值做累计求和,首次出现Success=1时,累计和为1;后续再出现Success=1时,累计和会大于1。- 通过双重条件
Success == 1 & cumsum(Success) == 1,仅选中每组第一个Success=1的行,标记为1,其余行设为0。
方法二:定位首次成功行号法
mydata %>% group_by(Fish_ID) %>% mutate(First_Success = case_when( row_number() == which(Success == 1)[1] ~ 1, TRUE ~ 0 )) %>% ungroup()
逻辑解释:
which(Success == 1)[1]获取每组中第一个Success=1的行在组内的位置。row_number()为每组内的行生成序号,当行号匹配首次成功的位置时标记为1,否则为0。- 若某组无
Success=1的记录,which(Success == 1)[1]返回NA,此时该行会被自动标记为0,符合需求。
关键修正点:
- 原代码分组列名
fish_ID与数据中的Fish_ID大小写不一致,会导致分组失效,需统一列名。 - 原代码变量名
Fist_Success为拼写错误,修正为First_Success。
内容的提问来源于stack exchange,提问作者Balina
相关产品推荐
相关产品推荐

