我在将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()
函数来做,因为它看起来更好处理。
9条答案
按热度按时间6ojccjat1#
两种备选解决方案:
1)使用data.table:
可以使用
melt
函数:字符串
其给出:
型
一些替代符号:
型
2)使用tidyr:
使用
pivot_longer()
:型
注意事项:
names_to
和values_to
分别默认为"name"
和"value"
,因此您可以将其非常简洁地写成wide %>% pivot_longer(
1950:
1954)
。cols
参数使用高度灵活的tidyselect DSL,因此您可以使用否定选择(!c(Code, Country)
)、选择帮助器(starts_with("19")
;matches("^\\d{4}$")
)、数字索引(3:7
)等来选择相同的列。tidyr::pivot_longer()
是tidyr::gather()
和reshape2::melt()
的继任者,这两个版本已不再开发。转换值
数据的另一个问题是,这些值将被R读取为字符值(由于数字中的
,
)。您可以在整形之前使用gsub
和as.numeric
进行修复:型
或者在整形期间,使用
data.table
或tidyr
:数据:
roejwanj2#
reshape()
需要一段时间来适应,就像melt
/cast
一样。这里是一个整形的解决方案,假设你的 Dataframe 被称为d
:字符串
fjaof16o3#
对于
tidyr_1.0.0
,另一个选项是pivot_longer
字符串
数据
型
zbq4xfa04#
使用 reshape 包:
字符串
kuuvgm7e5#
由于这个答案被标记为r-faq,我觉得分享另一个基于R的替代方案会很有用:
stack
。但是,请注意,
stack
不适用于factor
s-它只适用于is.vector
是TRUE
,并且从is.vector
的文档中,我们发现:is.vector
返回TRUE
,如果x是一个指定模式的向量,除了名称之外没有任何属性 *。否则返回FALSE
。我使用的是示例数据from @Jaap's answer,其中year列中的值为
factor
s。以下是
stack
方法:字符串
eivgtgni6#
下面是另一个例子,展示了从
tidyr
中使用gather
。您可以通过单独删除它们(就像我在这里做的那样)来选择gather
的列,或者通过显式包含您想要的年份。请注意,为了处理逗号(如果未设置
check.names = FALSE
,则添加X),我还使用dplyr
的mutate和readr
的parse_number
将文本值转换回数字。字符串
回报率:
型
gdrx4gfi7#
以下是sqldf解决方案:
字符串
要在不键入所有内容的情况下进行查询,可以使用以下命令:
感谢G. Grothendieck的实施。
不幸的是,我不认为
PIVOT
和UNPIVOT
适用于R
SQLite
。如果你想以更复杂的方式编写你的查询,你也可以看看这些帖子:sprintf
writing up sql queries的sqldf
的mu0hgdu08#
您还可以使用
cdata
包,它使用(转换)控制表的概念:字符串
我目前正在探索这个包,发现它很容易访问。它是为更复杂的转换而设计的,包括反向转换。有a tutorial可用。
scyqe7ek9#
这里有两个基本R中的选项(当输入是一个矩阵而不是一个矩阵时,使用
x=unlist(df)
而不是x=c(m)
):字符串
第三种选择是使用
as.table
后跟as.data.frame
,但它将行和列名转换为因子,如果输入是一个矩阵,则必须首先将其转换为矩阵:型
第四个选项是使用
stack
,但它将行名称和列名转换为因子,并且当输入是矩阵时列名转换为Rle因子(但当输入是矩阵时则不是):型
当
stack
的输入是一个字符串时,行名称不会作为列包含在内,所以你必须cbind
它们:型