You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:45:41