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
你的代码问题分析
- 错误修改B列:
mutate(B = if_else(B == 1, "A", "B"))完全没必要,原始数据中B的值是3和6,没有1,这一步反而破坏了原始B的取值。 - 分组逻辑错误:你按
B分组,但实际上需要按A分组(A的每个取值对应结果中的一行)。 - pivot参数错误:
names_from应该用原始的D列(目标列名的来源),而不是你生成的var;values_from应该提取C列的值,而不是A列。
- 多余的重命名:
rename(row_name = B)不符合目标格式的要求。
内容的提问来源于stack exchange,提问作者Inuraghe
相关产品推荐
相关产品推荐

