通过这 post,我发现了迷人的list2env()函数和dplyr列表,允许用户将命名列表的内容移出到全局环境中。不过,我遇到了一些问题,下面的例子最好地说明了这一点。
假设我们有一个数据集列表
df1 <- data.frame(x = letters[1:6], y = rnorm(6))
df2 <- data.frame(x = letters[1:6], y = rnorm(6))
df3 <- data.frame(x = letters[1:6], y = rnorm(6))现在假设我们要为每个函数应用一个函数,在这种情况下,将字符向量x转换为一个因子。为此,我们创建了一个函数。
factorFunct <- function(d) d %>% mutate(x = factor(x))现在,使用dplyr::lst(),我们可以创建一个包含所有数据集的列表,并将我们的函数应用于每个
library(dplyr)
dfList <- dplyr::lst(df1, df2, df3)
dfList <- lapply(dfList, function(i) factorFunct(i))现在,当我们检查列表中的每个数据集时,我们的字符向量已经更改为因子。
glimpse(dfList[[2]])
# Rows: 6
# Columns: 2
# $ x <fct> a, b, c, d, e, f
# $ y <dbl> -0.5809778, 0.8465600, 0.1022410, -0.9117389, 1.0635876, 0.3148138现在真正酷的是,使用list2env()函数,我们可以将转换后的数据集移回全局环境中。
list2env(dfList, .GlobalEnv)因此,原始数据集本身也已被转换。
glimpse(df2)
# Rows: 6
# Columns: 2
# $ x <fct> a, b, c, d, e, f
# $ y <dbl> -0.5809778, 0.8465600, 0.1022410, -0.9117389, 1.0635876, 0.3148138需要注意的一点是,我们的数据集列表被命名为
names(dfList)
# [1] "df1" "df2" "df3"到目前一切尚好。我的问题是,我尝试将一个不同的转换函数应用到列表中,一个在每个数据集中的变量子集中添加前缀的函数。此函数需要创建一个前缀列表。
preList <- dplyr::lst(one = "one", two = "two", three = "three")现在要创建添加前缀的函数,请使用来自rename_with()的dplyr函数
renameCols <- function(d, prefix) d %>% rename_with(.fn = ~ paste0(prefix, .x), .cols = matches("x"))现在,让我们将函数应用到上面创建的数据集列表中。
dfList <- lapply(1:length(dfList), function(i) renameCols(dfList[[i]], preList[[i]]))在它工作的列表中,x变量中添加了一个前缀。
glimpse(dfList[[3]])
# Rows: 6
# Columns: 2
# $ threex <fct> a, b, c, d, e, f
# $ y <dbl> 2.47582743, -0.04879153, -0.13771671, -0.41982932, -0.36765793, 0.21731860然而,这一次,当我们运行list2env函数将转换的数据集移回全局环境时,我们会得到一条错误消息。
list2env(dfList, .GlobalEnv)
# Error in list2env(dfList, .GlobalEnv) : names(x) must be a character vector of the same length as x我想我知道发生了什么,我的函数剥夺了dfList所需的名称,以便将列表中的每个元素移回全局环境中。
names(dfList)
# NULL我怀疑这是因为我在lapply()函数中使用了一个数字索引,而不是列表本身,但我不知道这是否是问题的真正根源,也不知道如何获得我需要的结果。
发布于 2022-03-01 05:57:53
您可以使用mget来避免临时列表,而重命名问题实际上要求使用Map。
Map(\(x, y)
setNames(factorFunct(x), paste0(c(y, ''), names(df1))),
mget(ls(pattern='^df\\d$')),
preList) |>
list2env(.GlobalEnv)
df1
# onex y
# 1 a 1.3709584
# 2 b -0.5646982
# 3 c 0.3631284
# 4 d 0.6328626
# 5 e 0.4042683
# 6 f -0.1061245
str(df1)
# 'data.frame': 6 obs. of 2 variables:
# $ onex: Factor w/ 6 levels "a","b","c","d",..: 1 2 3 4 5 6
# $ y : num 1.371 -0.565 0.363 0.633 0.404 ...注:R >= 4.1已使用。
在函数中,我们可以选择使用dplyr::mutate代替transform。
factorFunct <- function(d) transform(d, x=factor(x))https://stackoverflow.com/questions/71304088
复制相似问题