如何为数据框添加基于另一列唯一值的新列,值为对应score或0
需求实现:按分组生成对应值为score、其余为0的新列
需求说明:为数据框中Group列的每个唯一值创建独立新列,新列里仅对应原分组的行保留score列的数值,其余行全部填0。比如示例数据里的B列,只有第5-8行是5到8,其余都是0。
示例数据:
df <- data.frame(Group=rep(c('A', 'B', 'C', 'D'), each=4), score=1:16) df
方法一:用tidyverse的pivot_wider(推荐,代码简洁)
如果习惯用tidyverse工具链,这个方法最直观,一行转换搞定:
library(tidyverse) df_new <- df %>% pivot_wider(names_from = Group, # 新列名来自Group的唯一值 values_from = score, # 新列的值取自score values_fill = 0) # 非对应分组的行填0
方法二:Base R原生实现(无需额外包)
不想加载包的话,用循环+条件判断也能轻松实现:
# 先提取Group的所有唯一值 groups <- unique(df$Group) # 逐个生成新列 for (g in groups) { df[[g]] <- ifelse(df$Group == g, df$score, 0) }
方法三:用model.matrix快速生成哑变量矩阵
适合熟悉线性模型矩阵的场景,通过哑变量与score相乘得到结果:
# 生成无截距项的哑变量矩阵,每列对应一个分组 dummy_mat <- model.matrix(~ Group - 1, data = df) # 哑变量矩阵乘以score,再合并到原数据框 df_new <- cbind(df, dummy_mat * df$score)
验证结果:比如查看生成的B列,完全符合需求:
df_new$B # 输出:0 0 0 0 5 6 7 8 0 0 0 0 0 0 0 0
内容的提问来源于stack exchange,提问作者GT213
相关产品推荐
相关产品推荐

