如何将数据框中的三个日期列合并为一个变量?

时间:2017-10-08 13:56:30

标签: r

我的数据框看起来有点像这样:

   Type   Size `Jul-17` `Aug-17` `Sep-17`
1     A  Large       35       24       80
2     B Medium       81       13       38
3     C  Small       30       64       45
4     D  Large       97       68       65
5     E Medium       31       69       33
6     F  Small       84       74       12

我经常使用ddply函数,而不是像下面那样将三列相加...

result <- ddply(Example, .(Type), (summarize),
                Q3sum = sum(`Jul-17`, `Aug-17`, `Sep-17`))

我希望能够引用包含这三列的单个变量并将其称为&#34; Q3&#34;。有没有办法做到这一点仍然允许数据与ddply一起使用?我已尝试使用Q3<- c(`Jul-17`, `Aug-17`, `Sep-17`)将三列设置为单个变量,但它似乎无法正常工作。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

可重复的数据框:

read.table(check.names = FALSE, text="Type   Size Jul-17 Aug-17 Sep-17
A  Large       35       24       80
B Medium       81       13       38
C  Small       30       64       45
D  Large       97       68       65
E Medium       31       69       33
F  Small       84       74       12", header=TRUE, stringsAsFactors=FALSE) -> xdf

xdf
##   Type   Size Jul-17 Aug-17 Sep-17
## 1    A  Large     35     24     80
## 2    B Medium     81     13     38
## 3    C  Small     30     64     45
## 4    D  Large     97     68     65
## 5    E Medium     31     69     33
## 6    F  Small     84     74     12

如果您只想将列的总和放入一个Q3列:

xdf$Q3 <- rowSums(xdf[,3:5])

xdf
##   Type   Size Jul-17 Aug-17 Sep-17  Q3
## 1    A  Large     35     24     80 139
## 2    B Medium     81     13     38 132
## 3    C  Small     30     64     45 139
## 4    D  Large     97     68     65 230
## 5    E Medium     31     69     33 133
## 6    F  Small     84     74     12 170

如果您希望3个月组成“Q3”嵌套在一列中:

xdf$q3_alt <- apply(xdf, 1, function(x) { list(as.numeric(x[3:5])) })

xdf
##   Type   Size Jul-17 Aug-17 Sep-17  Q3     q3_alt
## 1    A  Large     35     24     80 139 35, 24, 80
## 2    B Medium     81     13     38 132 81, 13, 38
## 3    C  Small     30     64     45 139 30, 64, 45
## 4    D  Large     97     68     65 230 97, 68, 65
## 5    E Medium     31     69     33 133 31, 69, 33
## 6    F  Small     84     74     12 170 84, 74, 12

str(xdf)
## 'data.frame':    6 obs. of  7 variables:
##  $ Type  : chr  "A" "B" "C" "D" ...
##  $ Size  : chr  "Large" "Medium" "Small" "Large" ...
##  $ Jul-17: int  35 81 30 97 31 84
##  $ Aug-17: int  24 13 64 68 69 74
##  $ Sep-17: int  80 38 45 65 33 12
##  $ Q3    : num  139 132 139 230 133 170
##  $ q3_alt:List of 6
##   ..$ :List of 1
##   .. ..$ : num  35 24 80
##   ..$ :List of 1
##   .. ..$ : num  81 13 38
##   ..$ :List of 1
##   .. ..$ : num  30 64 45
##   ..$ :List of 1
##   .. ..$ : num  97 68 65
##   ..$ :List of 1
##   .. ..$ : num  31 69 33
##   ..$ :List of 1
##   .. ..$ : num  84 74 12

答案 1 :(得分:1)

解决方案是来自tidyr的聚集功能。如果你使用dplyr,你可以在一行代码中创建它。

> library(dplyr)
> library(tidyr)
> df%>%
+   gather(key = Q3,value = values,Jul_17:Sep_17)
   type     size     Q3 values
1     1 A  Large Jul_17     35
2     2 B Medium Jul_17     81
3     3 C  Small Jul_17     30
4     4 D  Large Jul_17     97
5     5 E Medium Jul_17     31
6     6 F  Small Jul_17     84
7     1 A  Large Aug_17     24
8     2 B Medium Aug_17     13
9     3 C  Small Aug_17     64
10    4 D  Large Aug_17     68
11    5 E Medium Aug_17     69
12    6 F  Small Aug_17     74
13    1 A  Large Sep_17     80
14    2 B Medium Sep_17     38
15    3 C  Small Sep_17     45
16    4 D  Large Sep_17     65
17    5 E Medium Sep_17     33
18    6 F  Small Sep_17     12

答案 2 :(得分:0)

听起来像你想要来自reshape2包的melt或者来自tidyr packge的gather的内容。它们会使data.frame更长,其中一列中的所有Jul-17Aug-17Sep-17值以及另一列声明每个数据点来自哪个月。

查看有关数据整理的nice primer