【问题标题】:Using the elements of a character vector as the data input name for a function使用字符向量的元素作为函数的数据输入名称
【发布时间】:2019-07-12 12:08:07
【问题描述】:

我有一些这样的数据集;

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

请问有什么解决办法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以首先创建一个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
    

    【讨论】:

    • 谢谢@boski,代码运行良好,而且比使用 for 循环更快。
    【解决方案2】:

    这是tidyverse的一个选项

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

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 2021-12-05
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2014-08-19
      • 2016-04-22
      • 2019-11-23
      相关资源
      最近更新 更多