如何基于DataFrame中A列的值将B列数据重组为新列
解决DataFrame按指定列取值重组列的问题
你用gather()和unite()完全搞反了——gather()是把宽表转成窄表,unite()是把多列合并成一列,这俩都不是用来实现你需求的工具。你要做的是把长格式数据转成宽格式,用tidyr包的pivot_wider()(新版)或者spread()(旧版)就能搞定。
示例操作步骤
先构造一个和你需求匹配的示例数据:
library(tidyr) library(dplyr) # 模拟你的原始DataFrame df <- tibble( Column_A = c("AMY", "STR", "AMY", "STR", "AMY"), Column_B = c(10, 20, 15, 25, 12), Column_C = c("X", "X", "Y", "Y", "Z"), Column_D = c(1, 1, 2, 2, 3) )
然后用pivot_wider()实现列重组:
# 生成以Column_A取值命名的新列,保留Column_C、Column_D作为行标识 new_df <- df %>% pivot_wider( id_cols = c(Column_C, Column_D), # 用来区分不同行的列(必须确保组合唯一) names_from = Column_A, # 新列名的来源(就是你的Column_A) values_from = Column_B # 新列值的来源(就是你的Column_B) )
参数补充说明
id_cols:指定哪些列作为行的唯一标识,这些列会保留在结果里,同一标识下的Column_A不同取值会被放到同一行的对应新列。- 如果你的数据里,同一
id_cols+Column_A组合有多个Column_B值,可以用values_fn指定处理逻辑,比如求和、取平均值:# 处理重复值:同一分组下的Column_B求和 new_df <- df %>% pivot_wider( id_cols = c(Column_C, Column_D), names_from = Column_A, values_from = Column_B, values_fn = sum )
旧版tidyr兼容方案
如果你用的是tidyr 1.0.0之前的版本,用spread()函数:
new_df <- df %>% spread(key = Column_A, value = Column_B)
内容的提问来源于stack exchange,提问作者genji01
相关产品推荐
相关产品推荐

