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

按ID分组标记数据框列中各值的首次出现(R语言)

按分组标记首次出现值的R实现

原始数据

生成数据的代码:

set.seed(456)
df <- data.frame(ID = rep(c('a', 'b'), each = 5), x = sample(1:3, 10, TRUE))

原始数据输出:

ID x
1   a 1
2   a 1
3   a 3
4   a 2
5   a 1
6   b 3
7   b 1
8   b 2
9   b 3
10  b 2

需求

按ID分组新增列y:同一分组内,x首次出现时y等于x,重复出现时y为NA,预期输出如下:

ID x  y
1   a 1  1
2   a 1 NA
3   a 3  3
4   a 2  2
5   a 1 NA
6   b 3  3
7   b 1  1
8   b 2  2
9   b 3 NA
10  b 2 NA

解决方案

1. 使用dplyr(tidyverse生态)

分组后用duplicated()判断是否为首次出现,通过mutate生成新列:

library(dplyr)

df <- df %>%
  group_by(ID) %>%
  mutate(y = if_else(!duplicated(x), x, NA_integer_)) %>%
  ungroup()

注:用if_else而非ifelse是为了严格保持整数类型,避免自动转换为数值型

2. 使用base R(无需额外包)

用ave()按分组处理每个x的序列:

df$y <- with(df, ave(x, ID, FUN = function(v) {
  ifelse(!duplicated(v), v, NA)
}))

结果验证

运行任意一种方法后,输出结果与预期完全一致:

ID x  y
1   a 1  1
2   a 1 NA
3   a 3  3
4   a 2  2
5   a 1 NA
6   b 3  3
7   b 1  1
8   b 2  2
9   b 3 NA
10  b 2 NA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:45:16