我正在尝试将部分变量与名称中的数字组合在一起。我有数百个变量,与我在下面的示例中包含的变量类似,因此不想使用简单的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
与字符串一起使用的事实有关。我不能简单地将所有矩阵绑定在一起然后删除,因为我实际上正在使用其他元素并不总是具有相同维度的列表。
答案 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