R语言中按ID分组从两列提取唯一值生成新列的方法
按ID分组生成combination列的解决方案
原始数据
df <- data.frame( ID = c(1,1,1,2,2,2,2), first = c(14,14,14,20,20,20,20), second = c(16,16,16,32,32,32,32) )
需求说明
创建名为combination的新列,按ID分组后,将每组first和second的唯一值依次填充到该列中,剩余行留空,预期结果如下:
ID first second combination 1 1 14 16 14 2 1 14 16 16 3 1 14 16 4 2 20 32 20 5 2 20 32 32 6 2 20 32 7 2 20 32
原有代码问题分析
你之前使用case_when的逻辑是逐行判断填充,会让每行都返回first或second,无法实现“依次填充唯一值、剩余行留空”的目标。
解决方案代码
方法1:填充NA(保持数值型)
library(dplyr) df <- df %>% group_by(ID) %>% # 提取组内first和second的唯一值,剩余行补NA mutate(combination = c(unique(c(first, second)), rep(NA, n() - length(unique(c(first, second)))))) %>% ungroup()
方法2:填充空字符串(匹配预期显示格式)
如果需要和预期结果一样显示为空而非NA,可转换为字符型:
library(dplyr) df <- df %>% group_by(ID) %>% mutate(combination = as.character(c(unique(c(first, second)), rep("", n() - length(unique(c(first, second))))))) %>% ungroup()
代码逻辑说明
group_by(ID):按ID分组处理每组数据unique(c(first, second)):提取当前组内first和second的所有唯一值(本例中每组两列值固定,会得到两个元素的向量)rep(..., n() - length(...)):生成与组内剩余行数一致的填充值(NA或空字符串)c(...):将唯一值和填充值拼接成与组内行数匹配的向量,实现依次填充的效果
内容的提问来源于stack exchange,提问作者Mia Lua
相关产品推荐
相关产品推荐

