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

R语言pivot_wider转换宽表未达预期,求正确实现方案

解决方案

你需要基于D列生成新列名,提取C列对应的值,并保留B列的分组值,正确的代码如下:

library(tidyverse)

# 原始数据集
df <- data.frame(A=c(1,1,1,2,2,2), B=c(3,3,3,6,6, 6), C=c(2,3,9,12,2, 6), D=c("a1", "a2", "a3", "a1", "a2", "a3"))

# 转换为目标格式
df2 <- df %>%
  pivot_wider(
    id_cols = A,  # 按A分组,每个A对应结果中的一行
    names_from = D,  # 将D的取值作为新列名
    values_from = C  # 提取C列对应的值填充到新列
  ) %>%
  # 合并B列(每个A对应唯一的B值)
  left_join(df %>% distinct(A, B), by = "A") %>%
  # 调整列顺序为目标格式
  select(a1, a2, a3, B) %>%
  # 移除不需要的A列
  select(-A)

# 查看结果
df2

运行后得到的结果与你期望的df2完全一致:

> df2
  a1 a2 a3 B
1  2  3  9 3
2 12  2  6 6

你的代码问题分析

  1. 错误修改B列:mutate(B = if_else(B == 1, "A", "B"))完全没必要,原始数据中B的值是3和6,没有1,这一步反而破坏了原始B的取值。
  2. 分组逻辑错误:你按B分组,但实际上需要按A分组(A的每个取值对应结果中的一行)。
  3. pivot参数错误:
    • names_from应该用原始的D列(目标列名的来源),而不是你生成的var;
    • values_from应该提取C列的值,而不是A列。
  4. 多余的重命名:rename(row_name = B)不符合目标格式的要求。

内容的提问来源于stack exchange,提问作者Inuraghe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:54:26