使用字符向量的元素作为函数的数据输入名称

时间:2019-07-12 12:08:07

标签: r

我有一些这样的数据集;

mydata1_sorted <- data.frame(Col1 = runif(3,1,5),
             Col2 = runif(3,1,5), 
             Col3 = runif(3,1,5))

mydata2_sorted <- data.frame(Col1 = runif(2,1,3),
             Col2 = runif(2,1,3), 
             Col3 = runif(2,1,3))

mydata3_sorted <- data.frame(Col1 = runif(2,1,6),
             Col2 = runif(2,1,6), 
             Col3 = runif(2,1,6))

我使用expand.grid函数,如下所示,它工作正常。

expand.grid(mydata1_sorted$Col1, mydata2_sorted$Col1, mydata3_sorted$Col1)

但是,由于某些原因,我需要在下面的列表中应用相同的功能。

datalist <- list( group1=c("mydata1","mydata2","mydata3"),
                group2 = c("mydata2","mydata3"),
                 group3 = c("mydata1","mydata3"))

为此,我编写了以下代码;

for(i in 1:length(datalist)) {

   list_sorted <- paste0(datalist[[i]],"_sorted$Col1")

   to_function <-noquote(paste(list_sorted, collapse=','))

   result <- expand.grid(to_function)

   print(result)

}

不幸的是,由于输出仅给出expend.grid内的字符,因此我还没有实现将向量传递给expend.grid函数的作用。

我发现了一个类似的question,包括mget函数。我尝试按以下方法应用它,

 mget(paste0("mydata", 1:3,"_sorted$Col1"))

但是我有这个: Error: value for ‘mydata1_sorted$Col1’ not found

请问有什么解决方法吗?

2 个答案:

答案 0 :(得分:2)

我们首先可以创建一个z对象,其中包含datalist每一组的所有行。然后我们将expand.grid应用于每个矩阵。请记住,$Col1必须在get()函数之外。

z=lapply(datalist,function(x){lapply(x,function(y) get(paste0(y,"_sorted"))$Col1)})
lapply(z,expand.grid)
$`group1`
       Var1     Var2     Var3
1  2.209588 2.600266 3.693475
2  3.251563 2.600266 3.693475
3  1.412309 2.600266 3.693475
4  2.209588 1.865730 3.693475
5  3.251563 1.865730 3.693475
6  1.412309 1.865730 3.693475
7  2.209588 2.600266 3.718085
8  3.251563 2.600266 3.718085
9  1.412309 2.600266 3.718085
10 2.209588 1.865730 3.718085
11 3.251563 1.865730 3.718085
12 1.412309 1.865730 3.718085

$group2
      Var1     Var2
1 2.600266 3.693475
2 1.865730 3.693475
3 2.600266 3.718085
4 1.865730 3.718085

$group3
      Var1     Var2
1 2.209588 3.693475
2 3.251563 3.693475
3 1.412309 3.693475
4 2.209588 3.718085
5 3.251563 3.718085
6 1.412309 3.718085

答案 1 :(得分:1)

这是tidyverse

的一个选项
library(tidyverse)
map(datalist, ~  mget(str_c(.x, "_sorted"), envir = .GlobalEnv) %>%
          map(pluck, 'Col1')) %>% 
          map(expand.grid)