首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将data.frame从宽格式重塑为长格式

将data.frame从宽格式重塑为长格式
EN

Stack Overflow用户
提问于 2010-02-02 23:36:13
回答 5查看 190.3K关注 0票数 204

我在将我的data.frame从宽桌转换为长桌时遇到了一些麻烦。目前看起来是这样的:

Code Country        1950    1951    1952    1953    1954
AFG  Afghanistan    20,249  21,352  22,532  23,557  24,555
ALB  Albania        8,097   8,986   10,058  11,123  12,246

现在我想把这个data.frame转换成一个长的data.frame。如下所示:

Code Country        Year    Value
AFG  Afghanistan    1950    20,249
AFG  Afghanistan    1951    21,352
AFG  Afghanistan    1952    22,532
AFG  Afghanistan    1953    23,557
AFG  Afghanistan    1954    24,555
ALB  Albania        1950    8,097
ALB  Albania        1951    8,986
ALB  Albania        1952    10,058
ALB  Albania        1953    11,123
ALB  Albania        1954    12,246

正如一些人在类似的问题中所建议的那样,我已经研究并尝试使用melt()reshape()函数。然而,到目前为止,我只得到了混乱的结果。

如果可能的话,我希望使用reshape()函数,因为它看起来更易于处理。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-03 00:08:00

就像melt/cast一样,reshape()需要一段时间才能适应。下面是一个具有重塑功能的解决方案,假设您的数据框名为d

reshape(d, 
        direction = "long",
        varying = list(names(d)[3:7]),
        v.names = "Value",
        idvar = c("Code", "Country"),
        timevar = "Year",
        times = 1950:1954)
票数 119
EN

Stack Overflow用户

发布于 2019-09-15 06:16:12

对于tidyr_1.0.0,另一个选项是pivot_longer

library(tidyr)
pivot_longer(df1, -c(Code, Country), values_to = "Value", names_to = "Year")
# A tibble: 10 x 4
#   Code  Country     Year  Value 
#   <fct> <fct>       <chr> <fct> 
# 1 AFG   Afghanistan 1950  20,249
# 2 AFG   Afghanistan 1951  21,352
# 3 AFG   Afghanistan 1952  22,532
# 4 AFG   Afghanistan 1953  23,557
# 5 AFG   Afghanistan 1954  24,555
# 6 ALB   Albania     1950  8,097 
# 7 ALB   Albania     1951  8,986 
# 8 ALB   Albania     1952  10,058
# 9 ALB   Albania     1953  11,123
#10 ALB   Albania     1954  12,246

数据

df1 <- structure(list(Code = structure(1:2, .Label = c("AFG", "ALB"), class = "factor"), 
    Country = structure(1:2, .Label = c("Afghanistan", "Albania"
    ), class = "factor"), `1950` = structure(1:2, .Label = c("20,249", 
    "8,097"), class = "factor"), `1951` = structure(1:2, .Label = c("21,352", 
    "8,986"), class = "factor"), `1952` = structure(2:1, .Label = c("10,058", 
    "22,532"), class = "factor"), `1953` = structure(2:1, .Label = c("11,123", 
    "23,557"), class = "factor"), `1954` = structure(2:1, .Label = c("12,246", 
    "24,555"), class = "factor")), class = "data.frame", row.names = c(NA, 
-2L))
票数 36
EN

Stack Overflow用户

发布于 2016-12-05 03:20:30

下面是另一个示例,展示了tidyrgather的用法。您可以选择要gather的列,方法是分别删除它们(就像我在这里所做的那样),或者显式地包含您想要的年份。

注意,为了处理逗号(以及在未设置check.names = FALSE的情况下添加的X),我还使用了来自readrdplyr的带parse_number的变异将文本值转换回数字。这些都是tidyverse的一部分,因此可以与library(tidyverse)一起加载

wide %>%
  gather(Year, Value, -Code, -Country) %>%
  mutate(Year = parse_number(Year)
         , Value = parse_number(Value))

返回:

   Code     Country Year Value
1   AFG Afghanistan 1950 20249
2   ALB     Albania 1950  8097
3   AFG Afghanistan 1951 21352
4   ALB     Albania 1951  8986
5   AFG Afghanistan 1952 22532
6   ALB     Albania 1952 10058
7   AFG Afghanistan 1953 23557
8   ALB     Albania 1953 11123
9   AFG Afghanistan 1954 24555
10  ALB     Albania 1954 12246
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2185252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档