【问题标题】:How to store mean vectors and covariance matrices in cells of a data table?如何在数据表的单元格中存储均值向量和协方差矩阵?
【发布时间】:2021-08-19 18:27:32
【问题描述】:

考虑一个具有两个数字和一个分类特征的数据表。我想将此数据表转换为新的数据表。该数据表的每一行都应对应于分类特征的一个值。此外,它应该包含一个列,其中包含由每个分类值的数字特征产生的平均向量加上一个包含协方差矩阵的列。此外,只能使用包含引用数字特征的列名称的对象。

似乎必须为此使用列表,例如参见R - store a matrix into a single dataframe cell。但是,这些信息对我的帮助还不够。

这是一个例子:

library(data.table)

set.seed(42)
a <- sample(1:3, 10, TRUE)
b <- rnorm(10)
d <- rpois(10, 3)
data <- data.table(a, b, d)
bd <- c("b", "d")

dat <- data[, 
            .(mu = mean(get(bd)), 
              sigma = get(cov(bd))), 
            by = a]

我想要的是dat 有三行,每行对应a 中的一个值。此数据表还应包含一个包含三个长度为 2 的向量的列和一个包含三个 2x2 矩阵的列。

【问题讨论】:

  • cov的使用不清楚。它需要matrix

标签: r data.table


【解决方案1】:

我们可以使用mget 代替get,因为get 用于返回单个对象值,mget 用于返回一个或多个对象

data[, lapply(mget(bd), function(x) mean(x)), by = a]

如果我们需要list

data[, .(mu = .(as.list(lapply(mget(bd), function(x) mean(x))))), by = a]

如果我们也想要两列,即cov

data[, .(mu = .(sapply(mget(bd), function(x) mean(x))), 
       sigma = .(cov(do.call(cbind, mget(bd)))[2])), by = a]
   a                  mu     sigma
1: 1 0.2353046,2.2000000 -2.131663
2: 2 0.1876238,3.3333333  2.062627
3: 3 0.9299794,1.5000000 0.1445644

【讨论】:

  • 感谢您的快速回复。此解决方案产生两个平均列。但是,我希望有一列不包含单个值,而是包含均值向量。
  • @FireSalamander 你的意思是list?然后将其包装在 list
  • 这是正确的方向。我在考虑更多类似data[, .(mu = .(sapply(mget(bd), function(x) mean(x)))), by = a] 的东西,其中每个列表元素都是一个向量。也许现在我想用cov() 函数实现什么变得更清楚了。第三列应包含属于均值的协方差矩阵。我试过data[, .(mu = .(sapply(mget(bd), function(x) mean(x))), sigma = .(cov(mget(bd)))), by = a],但这不起作用。
  • @FireSalamander 请检查更新的
  • 完美。实际上不需要子集,因为我需要整个矩阵,所以 sigma = .(cov(do.call(cbind, mget(bd)))) 是我想要的。非常感谢您的帮助。
猜你喜欢
  • 2012-03-12
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2014-02-07
相关资源
最近更新 更多