在 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)
}
我正在尝试在 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)
}