R语言中如何基于ID号创建标识同组答案一致性的新列
R语言按ID分组匹配列值生成新列的实现方法
完全可以实现,核心是按ID字段分组后,对组内的Val字段做一致性判断,再把结果赋值为新列即可,不需要硬编码全局行号引用值。
首先构造你给出的示例数据集:
# 示例数据 df <- data.frame( ID = c(1, 2, 3, 2, 3, 1), Val = c("yes", "yes", "yes", "no", "yes", "no") )
常用实现方案
1. dplyr包实现(代码可读性最高,日常分析首选)
按ID分组后,判断组内所有Val值是否和组内第一个值完全相等即可,完全匹配你提到的类Val[person 1] == Val[person 2]等值判断规则,且不受组内观测数量限制:
library(dplyr) df <- df %>% group_by(ID) %>% # 替换为 n_distinct(Val) == 1 逻辑完全等价 mutate(ans_consistent = all(Val == first(Val))) %>% ungroup()
运行后得到的结果:
| ID | Val | ans_consistent |
|---|---|---|
| 1 | yes | FALSE |
| 2 | yes | FALSE |
| 3 | yes | TRUE |
| 2 | no | FALSE |
| 3 | yes | TRUE |
| 1 | no | FALSE |
其中ID=3的组所有Val均为yes,标记为TRUE(答案一致);ID=1、ID=2的组同时存在yes和no,标记为FALSE(答案不一致),符合预期。
2. base R实现(无需安装第三方包)
不依赖第三方扩展包的情况下,可以用ave()函数完成分组计算:
df$ans_consistent <- as.logical( ave(as.integer(factor(df$Val)), df$ID, FUN = \(x) all(x == x[1])) )
注意:不要硬写全局行号做值匹配,比如直接写
Val[1] == Val[6]对应ID=1的两条记录,一旦数据排序、增删行就会完全失效,分组计算的写法对数据顺序变动的鲁棒性更强。
内容的提问来源于stack exchange,提问作者Arnav Paliwal
相关产品推荐
相关产品推荐

