2017-10-08 71 views
0

我有一个看起来有点像这样一个数据帧:如何将数据框中的三个日期列合并为一个变量?

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`)) 

我想要能够引用包含这三列的单个变量并将其称为“Q3”。有没有办法做到这一点,仍然会允许数据与ddply一起使用?我尝试使用Q3<- c(`Jul-17`, `Aug-17`, `Sep-17`)将三列设置为单个变量,但它似乎不起作用。

任何建议将不胜感激。

+1

您的预期结果如何? – jaySf

+0

而不是引用ddply中的三列,我会引用ddply中的一个变量来代替。 –

+0

因此,而不是'7月17日,'8月17日,'9月17日'它将只是“Q3”。 –

回答

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 
+0

这太好了。非常感谢。解决方案比我想象的要简单得多。 –

+0

aye @Jaap的确你是对的。 1秒。 – hrbrmstr

0

听起来像我想要的东西沿线来自tidyr包装的reshape2包装或gather的。它们将使您的data.frame在一列中的所有Jul-17,Aug-17Sep-17值更长,另一列将声明每个数据点来自哪个月。

看看这个nice primer关于数据整理。

+0

这非常有帮助。谢谢! –

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 
相关问题