【问题标题】:Create dynamic R dataframe names in for loop - multiple names in same code line在 for 循环中创建动态 R 数据框名称 - 同一代码行中的多个名称
【发布时间】:2021-08-27 20:48:15
【问题描述】:

我正在尝试在 for 循环中创建动态数据框名称。我正在使用 R 中的粘贴函数来编写数据框名称。看下面的例子:

for (i in 1:3){
 paste("Data",i,sep="") <- data.frame(colone=c(1,2,3,4),coltwo=c(5,6,7,8))
 paste("New data",i,sep="") <- paste("Data",i,sep="") %>% mutate(colthree=(colone+coltwo)*i) %>% select(colthree)
}

上面的代码不起作用,因为 R 不将粘贴理解为数据框名称。我找到了一些使用 assign 函数的解决方案,这些解决方案可以帮助我的第一行代码使用:assign(paste("Data",i,sep=""),data.frame(colone=c(1,2,3,4),coltwo=c(5,6,7,8))) 但我不知道如何处理第二行,其中两次使用 paste 函数来引用多个数据帧。不确定使用嵌套的分配函数是否有效,即使这样做,代码在更复杂的代码中看起来也会很糟糕。

我知道可能有关于如何将上面的 2 行组合成单个分配语句或其他类似解决方案的想法,但是根据我上面的示例,有没有办法在一行代码中引用 2 个动态数据帧名称?

非常感谢:)

【问题讨论】:

    标签: r dataframe for-loop dynamic assign


    【解决方案1】:

    这似乎有效,但有点令人费解:

    library(tidyverse)
    library(stringr)
    library(rlang)
    #> 
    #> Attaching package: 'rlang'
    #> The following objects are masked from 'package:purrr':
    #> 
    #>     %@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int,
    #>     flatten_lgl, flatten_raw, invoke, list_along, modify, prepend,
    #>     splice
    
    
    
    i <- seq(1, 3, 1) #how many loops
    
    pwalk(list(paste("Data",i,sep=""), paste("New_data",i,sep=""), i), ~{
        assign(..1, data.frame(colone=c(1,2,3,4),coltwo=c(5,6,7,8)), envir = .GlobalEnv)
        new <-  sym(..1) #convert a string to a variable name
        assign(..2, {eval_tidy(new)%>% mutate(colthree=(colone+coltwo)*..3) %>% select(colthree)}, envir = .GlobalEnv) 
        
    })
    
    names(.GlobalEnv)
    #> [1] "Data1"     "Data2"     "Data3"     "i"         "New_data1" "New_data2"
    #> [7] "New_data3"
    
    Data1
    #>   colone coltwo
    #> 1      1      5
    #> 2      2      6
    #> 3      3      7
    #> 4      4      8
    New_data1
    #>   colthree
    #> 1        6
    #> 2        8
    #> 3       10
    #> 4       12
    

    reprex package (v2.0.0) 于 2021-06-10 创建

    【讨论】:

      【解决方案2】:

      如果您需要两个数据框(“Data i”和“New Data i”),您可以使用:

      for (i in 1:3){
        assign(paste("New data",i,sep=""), data.frame(assign(paste("Data",i,sep=""),data.frame(colone=c(1,2,3,4),coltwo=c(5,6,7,8))) %>% mutate(colthree=(colone+coltwo)*i) %>% select(colthree)))
      }
      

      如果您只想要“新数据 i”,请使用:

      for (i in 1:3){
        assign(paste("New data",i,sep=""), data.frame(colone=c(1,2,3,4),coltwo=c(5,6,7,8))) %>% mutate(colthree=(colone+coltwo)*i) %>% select(colthree)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        相关资源
        最近更新 更多