0

更新 - 我需要使用 100 多个二维表执行计算。我知道这些表可以作为 data.frames 或数组导入到 R 中。

这是一个说明我的问题的例子。为简单起见,我的许多表用d1、d2、dd2和dd3表示。请注意,我在列表中添加了更多 data.frames,因为@BondedDust 提出的解决方案是在列表中有 2 个 data.frames 而不是 4 个 data.frames 时将 'sum' 替换为 '+'。

d1 = mtcars
d2 = d1*2
dd2 = d2 * 2
dd3 = d2 * d2

下面,如果操作是“+”,d3 将是我想要的最终输出。但我需要一种方法来自动化这个过程。

d3 = d1+d2 + dd2 + dd3 
> str(d3)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  2793 2793 3279 2898 2229 ...
 $ cyl : num  258 258 124 258 440 258 440 124 124 258 ...
 $ disp: num  154720 154720 70740 401190 780120 ...
 $ hp  : num  73370 73370 52545 73370 184975 ...
 $ drat: num  118.6 118.6 115.9 78.5 81.6 ...
 $ wt  : num  59.5 69.7 48.5 84.5 95.1 ...
 $ qsec: num  1741 1857 2208 2404 1857 ...
 $ vs  : num  0 0 13 13 0 13 0 13 13 13 ...
 $ am  : num  13 13 13 0 0 0 0 0 0 0 ...
 $ gear: num  124 124 124 75 75 75 75 124 124 124 ...
 $ carb: num  124 124 13 13 38 13 124 38 38 124 ...

所以我尝试使用列表,但是当我使用带有 '+' 的 do.call 和列表中的 4 个 data.frame 时,它​​不起作用。

l1 = list(d1,d2,dd2,dd3)
str(l1)

> str(l1)
List of 4
 $ :'data.frame':   32 obs. of  11 variables:
  ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...

d4 = do.call('+', l1)
Error in `+`(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4,  : 
  unused arguments (list(mpg = c(84, 84, 91.2, 85.6, 74.8, 72.4, 57.2, 97.6, 91.2, 76.8, 71.2, 65.6, 69.2, 60.8, 41.6, 41.6, 58.8, 129.6, 121.6, 135.6, 86, 62, 60.8, 53.2, 76.8, 109.2, 104, 121.6, 63.2, 78.8, 60, 85.6), cyl = c(24

这篇文章R - Vector/ Array Addition显示了类似的问题,但他们使用数组而不是 data.frames。因此,我尝试使用以下方法将 data.frames 转换为数组:

d5 = lapply(l1, function(x) data.matrix(x))

但是 d5 没有正确的结构,例如:

d6 = apply(d5,1:2,sum)

所以,我不确定问题是否出在我使用 lapply、do.call 或什么的方式上。任何帮助或方向将不胜感激。抱歉,如果我错过了之前已经解决过这个问题的帖子,我整天都在网上搜索并尝试了许多不同的选项,但都没有得到理想的结果。谢谢!

4

2 回答 2

1

您应该意识到这些不是“表格”,至少在技术 R 用语中是这样。R 表实际上是矩阵或数组,很容易使用“+”、“-”、“/”或“*”来进行元素操作。您正在显示 R 数据框。它们是列表,可以按名称添加。您可以遍历第一个数据框中的名称,然后在列中添加“+”:

 d3 <- as.data.frame(
              lapply(names(d1), function(x){ d1[ , x, drop=FALSE] + d2[ ,x]} ) )
 str(d3)

'data.frame':   32 obs. of  11 variables:
 $ mpg : num  63 63 68.4 64.2 56.1 54.3 42.9 73.2 68.4 57.6 ...
 $ cyl : num  18 18 12 18 24 18 24 12 12 18 ...
 $ disp: num  480 480 324 774 1080 ...
 $ hp  : num  330 330 279 330 525 315 735 186 285 369 ...
 $ drat: num  11.7 11.7 11.55 9.24 9.45 ...
 $ wt  : num  7.86 8.62 6.96 9.64 10.32 ...
 $ qsec: num  49.4 51.1 55.8 58.3 51.1 ...
 $ vs  : num  0 0 3 3 0 3 0 3 3 3 ...
 $ am  : num  3 3 3 0 0 0 0 0 0 0 ...
 $ gear: num  12 12 12 9 9 9 9 12 12 12 ...
 $ carb: num  12 12 3 3 6 3 12 6 6 12 ...

as.data.frame 是必需的,因为 lapply 将返回一个列表(这就是数据框的真正含义),但它会删除将列表建立为数据框的属性。

于 2015-02-05T07:28:24.017 回答
0

这是基于@biobirdman 评论的解决方案。所有的 data.frames 都具有相同的结构。

在真实模型的上下文中,如果您可以使用一台大型计算机,我最终可能会使用它,所以我将使用这台计算机。

d5=do.call('rbind',l1)
d5.rnames =rep(rownames(l1[[1]]),times=length(l1)) #not sure this is the best way to add a col with the names to do the aggregation
d5$reg=d5.rnames
d6 = aggregate(d5[,1:11], by=list(d5$reg), FUN=sum)
于 2015-02-08T23:31:55.960 回答