1

我有一个数据框,我想在 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

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

4

3 回答 3

5

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
于 2018-11-08T10:50:45.903 回答
1

您想使用 reshape 2 包的 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")
于 2018-11-08T10:53:12.373 回答
0

可以使用基本 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
于 2018-11-08T10:52:57.703 回答