R语言:基于条件与特定行位置生成response列的方法
问题描述
需要在R中生成一个0/1变量response,规则为:仅将每个uniqueclass分组中class == "migrate"的第一行设为1,其余所有行(包括同组内其他migrate行、stop和winter类行)设为0。
示例数据框:
df <- data.frame( individual = c("ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind1", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2", "ind2"), uniqueclass = c("migrate1", "migrate1", "stop1", "stop1", "stop1", "migrate2", "migrate2", "migrate2", "migrate2", "stop2", "stop2", "migrate3", "migrate3", "migrate3", "winter1", "winter1", "winter1", "migrate1", "migrate1", "stop1", "stop1", "stop1", "migrate2", "migrate2", "migrate2", "migrate2", "stop2", "stop2", "migrate3", "migrate3", "migrate3", "winter1", "winter1", "winter1"), class = c("migrate", "migrate", "stop", "stop", "stop", "migrate", "migrate", "migrate", "migrate", "stop", "stop", "migrate", "migrate", "migrate", "winter", "winter", "winter", "migrate", "migrate", "stop", "stop", "stop", "migrate", "migrate", "migrate", "migrate", "stop", "stop", "migrate", "migrate", "migrate", "winter", "winter", "winter"), mig_dur = c(10, 10, NA, NA, NA, 2, 2, 2, 2, NA, NA, 4, 4, 4, NA, NA, NA, 6, 6, NA, NA, NA, 3, 3, 3, 3, NA, NA, 1, 1, 1, NA, NA, NA) )
尝试的错误代码:
df_new <- df %>% group_by(individual) %>% mutate(response = ifelse(!is.na(mig_dur) & uniqueclass[1,], 1, 0)))
解决方案
方法1:使用dplyr包
核心是按uniqueclass分组(每个migrate事件由该字段唯一区分),在组内判断是否为第一行且属于migrate类:
library(dplyr) df_new <- df %>% group_by(uniqueclass) %>% mutate( response = ifelse(class == "migrate" & row_number() == 1, 1, 0) ) %>% ungroup()
方法2:使用Base R
无需额外包,用ave函数实现分组判断:
df$response <- with(df, as.integer(class == "migrate" & ave(seq_along(class), uniqueclass, FUN = function(x) x == x[1])) )
错误代码问题说明
- 分组对象错误:应该按
uniqueclass而非individual分组,因为每个migrate事件是由uniqueclass标识的。 - 索引方式错误:
uniqueclass[1,]的写法不符合分组内的行判断逻辑,正确的做法是用row_number()获取组内行号,判断是否为第一行。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

