如何像aggregate()那样创建data.frame / matrix?

时间:2014-07-16 01:11:38

标签: r

使用aggregate(),我可以得到这样的data.frame:

  V1 V2   V3
1  1  2    1
2  1  3 2, 3
3  1  4    4
4  1  5 5, 6
5  1  6    7

对于V3,它是向量列表。

> b1$V3
$`0`
[1] 1

$`1`
[1] 2 3

$`2`
[1] 4

$`3`
[1] 5 6

$`4`
[1] 7

这令我感到惊讶,因为我认为data.frame只有两个维度。我甚至可以将它转换为伪三维矩阵(虽然它不是真正的三维)。

> as.matrix(b1)
     V1 V2 V3       
[1,] 1  2  1        
[2,] 1  3  Numeric,2
[3,] 1  4  4        
[4,] 1  5  Numeric,2
[5,] 1  6  7 

但是,我无法以常规方式创建此类数据结构,例如向data.frame / matrix添加列表。由于这种结构很有用,我想知道它是如何创建的。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这种结构可以使用I函数进行。

mydf <- data.frame(
  a = 1:3,
  b = I(list(1, 3:5, 6:10))
)
str(mydf)
# 'data.frame':  3 obs. of  2 variables:
#  $ a: int  1 2 3
#  $ b:List of 3
#   ..$ : num 1
#   ..$ : int  3 4 5
#   ..$ : int  6 7 8 9 10
#   ..- attr(*, "class")= chr "AsIs"
as.matrix(mydf)
#      a b        
# [1,] 1 1        
# [2,] 2 Integer,3
# [3,] 3 Integer,5

您也可以通过手动添加列来执行此操作:

mydf2 <- data.frame(a = 1:3)
mydf2$b <- list(1, 3:5, 6:10)
str(mydf2)
as.matrix(mydf2)