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
相关产品推荐
相关产品推荐

