是否有一个R包包含一个data.frame的通用类,其中一列可以是一个数组(或者如何定义这样的类)?

是否有一个R包包含一个data.frame的通用类,其中一列可以是一个数组(或者如何定义这样的类)?,r,dataframe,R,Dataframe,我一直在想这个问题很久了。base R中的data.frame类只允许将列作为向量。我正在寻找一个包,该包可以概括这一点,使每个“列”都可以是一个2-d甚至n-d数组,具有与原始类data.frame类似的方法,例如带有“[]”的子设置、合并、聚合等 我之所以要上这样一门课,是为了处理蒙特卡罗模拟数据。例如,对于每个模拟,结果可以表示为数据帧,其中行索引为日期,列包括字符和数字。如果我模拟1000次,那么我得到1000个这样的数据帧。如果R中有一个类,我可以用它将结果存储在一个对象中,并且具有大

我一直在想这个问题很久了。base R中的data.frame类只允许将列作为向量。我正在寻找一个包,该包可以概括这一点,使每个“列”都可以是一个2-d甚至n-d数组,具有与原始类data.frame类似的方法,例如带有“[]”的子设置、合并、聚合等

我之所以要上这样一门课,是为了处理蒙特卡罗模拟数据。例如,对于每个模拟,结果可以表示为数据帧,其中行索引为日期,列包括字符和数字。如果我模拟1000次,那么我得到1000个这样的数据帧。如果R中有一个类,我可以用它将结果存储在一个对象中,并且具有大多数data.frame方法的便利性,那么我的编码就会容易得多

由于找不到这样的软件包,我试图创建自己的软件包,但没有成功。我发现这个包“S4Vectors”带有一个“DataFrame”类,它“支持存储任何类型的对象(使用长度和[methods]作为列)。”下面是我的尝试。

库(S4Vectors)

测试数据帧不允许矩阵列:

m <- diag(4)
v <- 1:4
DF <- data.frame(v, m = I(m))
str(DF)
更新1 R
aggregate
函数可以创建矩阵列。例如

DF <- data.frame(v = 1:4, g = c(1, 1, 2, 2))
ag <- aggregate(v ~ g, DF, function(x) c(sum = sum(x), mean = mean(x)))
str(ag)
更新2 我不认为评论中讨论的聚合在R中得到很好的支持,但您可以使用以下解决方法:

m <- matrix(1:16, 4)
v <- c(1, 1, 2, 2)
DF <- data.frame(v, m = I(m))

nr <- nrow(DF)
ag2 <- aggregate(list(sum = 1:nr), DF["v"], function(ix) colSums(DF$m[ix, ]))
str(ag2)

哦,这太令人惊讶了。我知道在创建数据帧时可以将矩阵作为列传递,但我认为这会使矩阵的每一列在数据帧中单独成为一列。请注意
data.frame(v,m)
data.frame(v,I(m))之间的区别
现在的问题是,聚合这样一个数据帧并不能保留结构,或者至少我不知道如何做。使用您的示例进行一个小改动,使我不清楚这个问题。我添加了一个示例,表明聚合确实会生成矩阵列。感谢您花时间回答我的问题选项。更具体地说,我的问题是,如果
DF,您可能会发现
tidyverse
中嵌套数据帧的概念很有用。请查看它(从25.2.1开始):
'data.frame':   2 obs. of  2 variables:
 $ g: num  1 2
 $ v: num [1:2, 1:2] 3 7 1.5 3.5
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "sum" "mean"
m <- matrix(1:16, 4)
v <- c(1, 1, 2, 2)
DF <- data.frame(v, m = I(m))

nr <- nrow(DF)
ag2 <- aggregate(list(sum = 1:nr), DF["v"], function(ix) colSums(DF$m[ix, ]))
str(ag2)
'data.frame':   2 obs. of  2 variables:
 $ v  : num  1 2
 $ sum: num [1:2, 1:4] 3 7 11 15 19 23 27 31