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

R语言dplyr分组生成新列:仅保留兼具幼体和成体的组中成体对应数值

R语言dplyr分组生成新列:仅保留兼具幼体和成体的组中成体对应数值

嗨,我看到你的问题了,咱们来一步步解决它~

你的需求很明确:按sp.name分组后,只有当组里同时存在young和adult两个阶段时,才在adult对应的行把number值放到新列new_column里,其他所有情况(包括同组的young行、以及只存在单一阶段的组的所有行)都填0。

先分析你现有代码的问题

你当前的代码里,当组同时包含两种阶段时,number[stage == 'adult']会取出该组中adult对应的number值,但因为mutate是逐行处理分组内的每一行,这个单一值会被自动广播到组内的所有行,导致同组的young行也拿到了adult的数值,这就是不符合预期的原因。

修正后的解决方案

我们需要把判断逻辑拆成两层:先确认当前组是否同时存在两种阶段,再判断当前行是不是adult,只有两层条件都满足时才返回number,否则返回0。这里提供两种写法,你可以根据习惯选择:

写法1:用辅助列更清晰

library(dplyr)

# 你的原始数据
df <- data.frame(
  sp.name= c('a','a', 'b', 'b' ,'c', 'd' ),
  number=c(2,2,3, 3,4,4),
  stage= c('adult', 'young', 'young','adult', 'adult', 'young')
)

df_processed <- df %>%
  group_by(sp.name) %>%
  mutate(
    # 先判断当前组是否同时包含young和adult
    has_both_stages = all(c('young', 'adult') %in% stage),
    # 双重条件:组内有双阶段 且 当前行是adult,才返回number,否则0
    new_column = ifelse(has_both_stages & stage == 'adult', number, 0)
  ) %>%
  select(-has_both_stages)  # 移除辅助列,让结果更简洁

print(df_processed)

写法2:合并逻辑成一行(更紧凑)

df_processed <- df %>%
  group_by(sp.name) %>%
  mutate(
    new_column = ifelse(all(c('young', 'adult') %in% stage) & stage == 'adult', number, 0)
  )

print(df_processed)

运行后的结果

两种写法都会得到你想要的输出:

# A tibble: 6 × 4
# Groups:   sp.name [4]
  sp.name number stage  new_column
  <chr>    <dbl> <chr>       <dbl>
1 a            2 adult           2
2 a            2 young           0
3 b            3 young           0
4 b            3 adult           3
5 c            4 adult           0
6 d            4 young           0

备注:内容来源于stack exchange,提问作者Saneesh C S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:24:29