如何在R中堆叠数据框[重复]

Posted

技术标签:

【中文标题】如何在R中堆叠数据框[重复]【英文标题】:How to stack a dataframe in R [duplicate] 【发布时间】:2019-04-11 20:44:12 【问题描述】:

我有一个数据框,我想将它堆叠在 R 中,以便最终得到三列。下面是一些当前格式的示例数据。

> dput(df)
structure(list(Day = c("d1", "d2", "d3", "d4", "d5", "d6", "d7", 
"d8", "d9", "d10"), A1 = c(14L, 24L, 22L, NA, NA, NA, NA, NA, 
NA, NA), A2 = c(9L, 15L, 34L, 2L, 12L, 34L, 234L, 34L, NA, NA
), A3 = c(3L, 4L, 19L, 76L, 34L, 34L, 23L, 24L, 37L, 44L), A1.1 = c(34L, 
55L, 75L, 12L, 56L, 35L, 3L, 22L, NA, NA)), .Names = c("Day", 
"A1", "A2", "A3", "A1.1"), class = "data.frame", row.names = c(NA, 
-10L))

> df
   Day A1  A2 A3 A1.1
1   d1 14   9  3   34
2   d2 24  15  4   55
3   d3 22  34 19   75
4   d4 NA   2 76   12
5   d5 NA  12 34   56
6   d6 NA  34 34   35
7   d7 NA 234 23    3
8   d8 NA  34 24   22
9   d9 NA  NA 37   NA
10 d10 NA  NA 44   NA

我希望最终得到这样格式的数据框,其中包含三列标题为“Day”、“Animal”和“Count”:

   Day  Animal  Count
d1  A1  14
d2  A1  24
d3  A1  22
d4  A1  NA
d5  A1  NA
d6  A1  NA
d7  A1  NA
d8  A1  NA
d9  A1  NA
d10 A1  NA
d1  A2  9
d2  A2  15
d3  A2  34
d4  A2  2
d5  A2  12
d6  A2  34
d7  A2  234
d8  A2  34
d9  A2  NA
d10 A2  NA
d1  A3  3
d2  A3  4
d3  A3  19
d4  A3  76
d5  A3  34
d6  A3  34
d7  A3  23
d8  A3  24
d9  A3  37
d10 A3  44
d1  A1  34
d2  A1  55
d3  A1  75
d4  A1  12
d5  A1  56
d6  A1  35
d7  A1  3
d8  A1  22
d9  A1  NA
d10 A1  NA

我知道这应该是一件容易的事,但我真的很难找到解决方案。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

使用dplyrtidyr

library(dplyr)
library(tidyr)
df <- df %>% 
  gather("animal", "count", -Day)


head(df)
#   Day animal count
# 1  d1     A1    14
# 2  d2     A1    24
# 3  d3     A1    22
# 4  d4     A1    NA
# 5  d5     A1    NA
# 6  d6     A1    NA

【讨论】:

太棒了!太感谢了!赞赏。您能否将 library(tidyr) 添加到您的收集功能答案中? 我已经更新了我的问题,因为我有一个大型数据框,其中包含相同动物和 Days 的多个数据块,但值不同,您的解决方案在这种情况下不起作用。有什么建议?这是我收到的错误消息:错误:无法绑定数据,因为某些参数具有相同的名称调用rlang::last_error() 以查看回溯 即使使用新数据也对我有用,请先尝试清理工作区,然后重试 没有。我已经多次尝试了多个示例,但每次都会遇到相同的错误:( 你有dplyrtidyr 的哪个版本?见packageVersion("dplyr")。尝试通过重新安装两者来更新到最新版本:devtools::install_github("hadley/dplyr")install_packages("dplyr")【参考方案2】:

可以用基础R函数melt

melt(df)

OUTPUT :

Day variable value
1   d1       A1    14
2   d2       A1    24
3   d3       A1    22
4   d4       A1    NA
5   d5       A1    NA
6   d6       A1    NA
7   d7       A1    NA
8   d8       A1    NA
9   d9       A1    NA
10 d10       A1    NA
11  d1       A2     9
12  d2       A2    15
13  d3       A2    34
14  d4       A2     2
15  d5       A2    12
16  d6       A2    34
17  d7       A2   234
18  d8       A2    34
19  d9       A2    NA
20 d10       A2    NA
21  d1       A3     3
22  d2       A3     4
23  d3       A3    19
24  d4       A3    76
25  d5       A3    34
26  d6       A3    34
27  d7       A3    23
28  d8       A3    24
29  d9       A3    37
30 d10       A3    44

【讨论】:

【参考方案3】:

您想使用 reshape 2 包 also answered here 的 melt 功能将数据帧从宽格式格式化为长格式

library(reshape2)

df <- structure(list(Day = c("d1", "d2", "d3", "d4", "d5", "d6", "d7", 
                       "d8", "d9", "d10"), A1 = c(14L, 24L, 22L, NA, NA, NA, NA, NA, 
                                                  NA, NA), A2 = c(9L, 15L, 34L, 2L, 12L, 34L, 234L, 34L, NA, NA
                                                  ), A3 = c(3L, 4L, 19L, 76L, 34L, 34L, 23L, 24L, 37L, 44L)), .Names = c("Day", 
                                                                                                                         "A1", "A2", "A3"), class = "data.frame", row.names = c(NA, -10L
                                                                                                                         ))
long_format <- melt(df)
colnames(long_format)[2:3] <- c("Animal","Count")

【讨论】:

melt如何判断id变量是什么?或者我将如何指定这个?在我庞大的数据集中,它无法做到这一点。 @jjulip 您可以尝试?melt.data.frame 以获取有关该功能的更多信息。参见例如在 Argumentsid.vars 下。

以上是关于如何在R中堆叠数据框[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中创建堆叠的条形图[重复]

如何在数据框中旋转包含字符串的一列? [重复]

如何在 R 中合并同一数据框中的行(基于特定列下的重复值)?

如何在python中为具有多个索引的数据框制作堆叠图?

如何在R中的空数据框中创建新列[重复]

如何从R中的数据框中删除重复的行[重复]