表之间的循环算术计算

时间:2016-07-06 11:19:07

标签: r loops math

我的桌子看起来像这样:

table1

            Not Visible Visible <NA>
All           0.29       0.50   0.20
Bowtie        0.24       0.17   0.59
Cola          0.15       0.83   0.02
Squig         0.49       0.51   0.49

然后我有9个其他类似的表。以下是一个例子:

 table2

          Not Visible Visible <NA>
All           0.28    0.50    0.23
Bowtie        0.11    0.30    0.59
Cola          0.30    0.67    0.03
Squig         0.42    0.51    0.06

我希望table1 - table2的结果如下所示,但我也希望表1包含其他9个表格。

       Not Visible  Visible  <NA>
All           0.01    0.00 -0.03
Bowtie        0.13   -0.13  0.00
Cola         -0.15    0.16 -0.01
Squig         0.07    0.00  0.43

如何在不编写Table 1 - table 2; table 1 - table 3; table 1 - table 4等的情况下执行此操作? 如果我尝试使用下面的代码循环(作为示例),我得到二进制错误的非数字参数:

Tables <- c("table1", "table2") ## as an example

for (r in Tables) {

yy <- paste(r,"res", sep = "-")
  zz <- table1-r
  assign(yy,zz)

}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

考虑使用表的列表(不是其名称的字符串文字),然后使用lapply(),其中结果列表可以保存为单个表或绑定到数据帧中:

# LIST OF TABLES WITH NAMED ELEMENTS (t1 NOT INCLUDED)
tables <- setNames(list(t2, t3, t4, t5, t6, t7, t8, t9), 
                   c("table2", "table3", "table4", "table5",
                     "table6", "table7", "table8", "table9"))

# ITERATIVELY SUBTRACT FROM t1
tableList <- lapply(tables, function(x) t1 - x)

# SAVE EACH TABLE AS SEPARATE OBJECTS 
list2env(tableList, envir=.GlobalEnv)

# DATAFRAME BINDING - WIDE FORMAT (INCLUDING t1)
df <- as.data.frame(cbind(t1, do.call(cbind, tableList)))

# DATAFRAME BINDING - LONG FORMAT (INCLUDING t1)
df <- as.data.frame(rbind(t1, do.call(rbind, tableList)))

答案 1 :(得分:0)

你可以试试这个而不用循环

z=names(table1)

table3 = table1[z]-table2[z]