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

RStudio新手求助:如何一步实现数据框的行列转置透视?

解决RStudio中数据透视的问题

你好!别着急,这个问题其实用tidyverse包里的pivot_longer和pivot_wider组合就能轻松解决,完全不需要转矩阵,我帮你一步步拆解:

首先,先把你的示例数据在R中重现出来,方便测试:

library(tidyverse)

# 构造你的原始数据框
df <- tibble(
  ISO = c("ARB", "CSS"),
  Indicator = c("Use of electricity", "Population"),
  `2009` = c(0.5, 2.5),
  `2010` = c(0.5, 3.5),
  `2011` = c(0.4, 0.5)
)

接下来,我们先把年份列(2009、2010、2011)转成长格式,同时保留ISO和Indicator信息,这一步用pivot_longer:

df_long <- df %>%
  pivot_longer(cols = `2009`:`2011`, names_to = "Year", values_to = "Value") %>%
  mutate(Year = as.numeric(Year)) # 把Year转成数值型,和你之前的需求一致

然后再把Indicator列转成宽格式的列(也就是你要的Use of electricity和Population列),用pivot_wider:

df_final <- df_long %>%
  pivot_wider(names_from = Indicator, values_from = Value)

执行完这两步,你就能得到完全符合预期的结果:

# A tibble: 6 × 4
  ISO   Year `Use of electricity` Population
  <chr> <dbl>                <dbl>      <dbl>
1 ARB    2009                  0.5       NA  
2 ARB    2010                  0.5       NA  
3 ARB    2011                  0.4       NA  
4 CSS    2009                 NA         2.5 
5 CSS    2010                 NA         3.5 
6 CSS    2011                 NA         0.5

为什么你之前用spread报错?

大概率是因为你在gather之后,数据类型或者列名的细节问题,比如Year的类型未统一,或者旧版spread函数对数据格式的兼容性不如pivot_wider——pivot_wider是tidyverse更新后的函数,处理这类转换更健壮。

能不能一步实现?

当然可以,把两步合并成一个管道操作,一行就能完成:

df_final <- df %>%
  pivot_longer(cols = `2009`:`2011`, names_to = "Year", values_to = "Value") %>%
  mutate(Year = as.numeric(Year)) %>%
  pivot_wider(names_from = Indicator, values_from = Value)

如果你的原始数据里年份列是动态的(比如不止2009-2011),可以把cols = 2009:2011``改成cols = -c(ISO, Indicator),这样会自动选中除了ISO和Indicator之外的所有列作为年份列,适配性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:17:40