按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
相关产品推荐
相关产品推荐

