2014-12-07 148 views
3

我具有以下的数据和代码:变化数据帧结构中的R

mydf = structure(list(vint1 = c(5L, 5L, 5L, 1L, 4L, 9L, 2L, 1L, 7L, 
9L, 6L, 8L, 8L, 7L, 8L, 1L, 7L, 9L, 3L, 9L, 5L, 3L, 7L, 10L, 
8L, 9L, 3L, 2L, 9L, 4L, 8L, 10L, 8L, 2L, 1L, 9L, 3L, 5L, 9L, 
7L, 8L, 8L, 5L, 6L, 6L, 8L, 9L, 3L, 3L, 7L, 6L, 5L, 8L, 7L, 4L, 
5L, 3L, 2L, 5L, 7L, 7L, 9L, 1L, 2L, 3L, 3L, 8L, 8L, 2L, 10L, 
6L, 7L, 7L, 8L, 9L, 9L, 4L, 5L, 1L, 6L, 5L, 1L, 9L, 5L, 6L, 1L, 
5L, 5L, 8L, 9L, 6L, 7L, 3L, 1L, 5L, 4L, 1L, 10L, 6L, 7L), vch1 = structure(c(3L, 
2L, 5L, 2L, 3L, 5L, 3L, 2L, 2L, 2L, 4L, 1L, 5L, 1L, 2L, 3L, 4L, 
3L, 4L, 5L, 2L, 2L, 4L, 3L, 2L, 3L, 3L, 5L, 4L, 5L, 2L, 1L, 4L, 
5L, 1L, 2L, 1L, 5L, 3L, 2L, 3L, 5L, 2L, 4L, 3L, 3L, 2L, 1L, 2L, 
3L, 4L, 4L, 5L, 4L, 5L, 4L, 3L, 5L, 1L, 4L, 4L, 2L, 2L, 3L, 2L, 
1L, 1L, 4L, 3L, 1L, 3L, 2L, 3L, 2L, 3L, 1L, 3L, 2L, 1L, 3L, 1L, 
5L, 5L, 2L, 5L, 2L, 4L, 2L, 2L, 3L, 5L, 2L, 3L, 3L, 5L, 3L, 3L, 
1L, 4L, 4L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), 
    vbin1 = structure(c(2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 
    2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 
    2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 
    1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 
    2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 
    2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L 
    ), .Label = c("a", "b"), class = "factor")), .Names = c("vint1", 
"vch1", "vbin1"), class = "data.frame", row.names = c(NA, -100L 
)) 

aa = aggregate(vint1~vch1+vbin1, mydf, function(x) quantile(x, c(50,66,90)/100)) 
aa 
    vch1 vbin1 vint1.50% vint1.66% vint1.90% 
1  A  a  6.50  8.62  10.00 
2  B  a  7.50  8.26  9.00 
3  C  a  4.00  6.24  8.60 
4  D  a  6.50  7.00  7.00 
5  E  a  5.50  7.88  9.00 
6  A  b  6.00  7.30  9.00 
7  B  b  5.00  7.00  8.00 
8  C  b  6.00  8.20  9.00 
9  D  b  7.00  7.00  8.00 
10 E  b  5.00  5.96  8.00 

str(aa) 
'data.frame': 10 obs. of 3 variables: 
$ vch1 : Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 1 2 3 4 5 
$ vbin1: Factor w/ 2 levels "a","b": 1 1 1 1 1 2 2 2 2 2 
$ vint1: num [1:10, 1:3] 6.5 7.5 4 6.5 5.5 6 5 6 7 5 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : NULL 
    .. ..$ : chr "50%" "66%" "90%" 

正如我们所看到的,第三,第四和“AA”(总产量)的第五列不是3实列,但其中的一部分变量(如命令str(aa)所示)。我怎样才能将它转换成3个不同的列?谢谢你的帮助。

回答

2

问题是aggregatequantile获得矩阵,并将其作为单列添加。快速,后 - 事实上的解决将是

cbind(aa[,-3], vint1=aa[,3]) 

它使用cbind到矩阵的列用data.frame的列组合在一起。

根据需要,这将给你的结构

'data.frame': 10 obs. of 5 variables: 
$ vch1  : Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 1 2 3 4 5 
$ vbin1 : Factor w/ 2 levels "a","b": 1 1 1 1 1 2 2 2 2 2 
$ vint1.50%: num 6.5 7.5 4 6.5 5.5 6 5 6 7 5 
$ vint1.66%: num 8.62 8.26 6.24 7 7.88 7.3 7 8.2 7 5.96 
$ vint1.90%: num 10 9 8.6 7 9 9 8 9 8 8 

+0

它简单而完美。关于它如何工作的解释将不胜感激。 – rnso 2014-12-08 00:21:03