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

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]))
                    )

错误代码问题说明

  1. 分组对象错误:应该按uniqueclass而非individual分组,因为每个migrate事件是由uniqueclass标识的。
  2. 索引方式错误:uniqueclass[1,]的写法不符合分组内的行判断逻辑,正确的做法是用row_number()获取组内行号,判断是否为第一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:23:26