将函数应用于以R中的特定模式开头的所有变量

时间:2013-06-22 16:26:05

标签: r

我有一个带有变量test1test2test3test4,... testn的R工作区。这些变量都是相同长度的列表。我想使用mapply()组合这些列表,如下例所示:

    test_matrix=mapply(c, test1, test2,..testn)

如何对以"test"开头的所有变量执行此操作,并按test1test2,... testn的顺序执行此操作?

3 个答案:

答案 0 :(得分:6)

要准确回答OP要求的内容(mapply(c, test1, test2,..testn)),请执行:

do.call(mapply, c(FUN = c, mget(paste0("test", 1:n))))

如果您不知道有多少(n)个列表,并希望使用模式找到它们:

do.call(mapply, c(FUN = c, mget(ls(pattern = "^test\\d+$"))))

与目前为止的其他答案一样,使用ls的方法如果有超过九个对象,则不会对对象进行正确排序,因为它们按字母顺序排序。更长但完全健壮的版本将是:

test.lists    <- ls(pattern = "^test\\d+$")
ordered.lists <- test.lists[order(as.integer(sub("test", "", test.lists)))]
do.call(mapply, c(FUN = c, mget(ordered.lists)))

答案 1 :(得分:3)

这是一种可能性

test1 <- list(1,2,3)
test2 <- list(3,4,5)
test3 <- list(5,6,7)
varnames <- ls(pattern="test.*")
sapply(varnames, get)

答案 2 :(得分:2)

如果我理解正确,这将满足您的需求:

test_matrix <- mapply(get, ls(pattern='test*'))

test_matrix将是matrix类,其中列test1 ... testn,但只有n<=9。如果在您的情况下n可以大于9,那么请使用test001之类的名称,这样您就可以获得正确的排序n=999

供你参考,我的“r-fiddles”:

test2 <- 2:5
test1 <- 1:4

m <- mapply(get, ls(pattern='test*'))
m
     test1 test2
[1,]     1     2
[2,]     2     3
[3,]     3     4
[4,]     4     5
class(m)
[1] "matrix"