将部分变量与名称中的数字组合在一起

时间:2014-01-28 15:24:10

标签: r

我正在尝试将部分变量与名称中的数字组合在一起。我有数百个变量,与我在下面的示例中包含的变量类似,因此不想使用简单的cbind

示例:

test.1 <- matrix(1:10, nrow = 5)
test.2 <- matrix(11:20, nrow = 5)
test.3 <- matrix(21:30, nrow = 5)

我可以轻松地使用do.call来组合变量,如下所示:

test.combi_works <- do.call(cbind, lapply(paste0("test.", 1:3), get))

但我只需要每个矩阵的第一列。

首次尝试:

test.combi <- do.call(cbind, lapply(paste0("test.", 1:3, "[,1]"), get))
Error in FUN(c("test.1[,1]", "test.2[,1]", "test.3[,1]")[[1L]], ...) : 
  object 'test.1[,1]' not found

第二次尝试:

test.combi2 <- do.call(cbind, lapply(noquote(paste0("test.", 1:3, "[,1]")), get))
Error in FUN(X[[1L]], ...) : object 'test.1[,1]' not found

我认为这与get与字符串一起使用的事实有关。我不能简单地将所有矩阵绑定在一起然后删除,因为我实际上正在使用其他元素并不总是具有相同维度的列表。

2 个答案:

答案 0 :(得分:1)

您可以将新功能传递给do.call来执行获取和子集化。正如@Llopis指出的那样,问题是test.1[,1]不仅仅是一个对象;它是一个应用了函数的对象(test.1)([,1]是函数调用)。因为get仅适用于对象,所以应首先获取对象,然后应用子集化函数。

对于单个对象,这看起来像:

myfun <- function(x) { get(x)[,1] }
myfun("test.1")

您可以将相同的功能传递到lapply

test.combi_works <- do.call(
  cbind, lapply(paste0("test.", 1:3), function(x) { get(x)[,1] } )
)

答案 1 :(得分:1)

这是一个不使用paste和字符串

的解决方案
do.call(cbind, 
        lapply(mget(ls()[grep('test',ls())]), function(x) x[ , 1]))

我想@Roland正在试图巧妙地说,保持工作空间有序是一个很好的基本做法,可以避免以后的错误。列表是一种非常简单的方法。

     test.1 test.2 test.3
[1,]      1     11     21
[2,]      2     12     22
[3,]      3     13     23
[4,]      4     14     24
[5,]      5     15     25