在 for 循环中创建动态 R 数据框名称 - 同一代码行中的多个名称

Create dynamic R dataframe names in for loop - multiple names in same code line

我正在尝试在 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 无法将 paste 理解为数据框名称。我找到了一些使用 assign 函数的解决方案,这些解决方案可以帮助我使用以下代码的第一行: assign(paste("Data",i,sep=""),data.frame(colone=c(1,2,3,4),coltwo=c(5,6,7,8))) 但我不知道如何处理第二行,其中两次使用粘贴函数来引用多个数据帧.不确定使用嵌套赋值函数是否有效,即使它有效,使用更复杂的代码,代码看起来也很糟糕。

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

非常感谢:)

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

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 年 6 月 10 日创建

如果您需要两个数据框(“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)
}