我在将我的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()
函数,因为它看起来更易于处理。
发布于 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)
发布于 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))
发布于 2016-12-05 03:20:30
下面是另一个示例,展示了tidyr
中gather
的用法。您可以选择要gather
的列,方法是分别删除它们(就像我在这里所做的那样),或者显式地包含您想要的年份。
注意,为了处理逗号(以及在未设置check.names = FALSE
的情况下添加的X),我还使用了来自readr
的dplyr
的带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
https://stackoverflow.com/questions/2185252
复制相似问题