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

基于两列组合重排数据列:tidyr与dplyr实操问题

用tidyr和dplyr实现长格式转宽格式的解决方案

嘿,刚巧你正在学tidyr和dplyr,这俩包刚好能完美解决你这个长转宽的问题!我来一步步给你讲清楚怎么做:

首先,先把你的示例数据集用tidyverse的tibble构造出来(方便后续操作):

library(tidyverse)

# 构造你的原始数据集
df <- tibble(
  `Factor 1` = c("A", "A", "B", "B"),
  `Factor 2` = c("green", "green", "yellow", "yellow"),
  Year = c(2016, 2017, 2017, 2018),
  value = c(1.2, 1.9, 3, 8)
)

接下来用tidyr里的pivot_wider()函数(这是替代旧版spread()的更灵活函数)来完成转换,完全符合你想要的格式:

# 长转宽操作
wide_df <- df %>%
  pivot_wider(
    id_cols = c(`Factor 1`, `Factor 2`),  # 用来分组的标识列
    names_from = Year,                   # 要转成新列名的列
    values_from = value,                 # 对应新列的值来源
    names_prefix = "Year."               # 给新列名加前缀"Year."
  )

# 查看结果
print(wide_df)

运行之后你会得到和你期望完全一致的输出:

# A tibble: 2 × 5
  `Factor 1` `Factor 2` Year.2016 Year.2017 Year.2018
  <chr>      <chr>          <dbl>     <dbl>     <dbl>
1 A          green            1.2       1.9        NA
2 B          yellow          NA         3          8

简单解释下关键参数:

  • id_cols:指定哪些列是用来唯一标识每一行的(也就是不需要转换的分组列),这里就是Factor 1和Factor 2;
  • names_from:把哪一列的取值变成新的列名,这里是Year;
  • values_from:新列对应的值来自哪一列,这里是value;
  • names_prefix:给新生成的列名加前缀,刚好满足你要的Year.2016这种格式。

之前用基础R函数没成功很正常,基础R的reshape()函数参数相对繁琐,而tidyverse的函数更贴合直观的思维逻辑,刚好适合你现在学习的方向~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:23:38