首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >索引列表会给list2env()函数带来问题

索引列表会给list2env()函数带来问题
EN

Stack Overflow用户
提问于 2022-03-01 05:26:46
回答 1查看 90关注 0票数 1

通过 post,我发现了迷人的list2env()函数和dplyr列表,允许用户将命名列表的内容移出到全局环境中。不过,我遇到了一些问题,下面的例子最好地说明了这一点。

假设我们有一个数据集列表

代码语言:javascript
运行
复制
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转换为一个因子。为此,我们创建了一个函数。

代码语言:javascript
运行
复制
factorFunct <- function(d) d %>% mutate(x = factor(x))

现在,使用dplyr::lst(),我们可以创建一个包含所有数据集的列表,并将我们的函数应用于每个

代码语言:javascript
运行
复制
library(dplyr)
dfList <- dplyr::lst(df1, df2, df3)
dfList <- lapply(dfList, function(i) factorFunct(i))

现在,当我们检查列表中的每个数据集时,我们的字符向量已经更改为因子。

代码语言:javascript
运行
复制
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()函数,我们可以将转换后的数据集移回全局环境中。

代码语言:javascript
运行
复制
list2env(dfList, .GlobalEnv)

因此,原始数据集本身也已被转换。

代码语言:javascript
运行
复制
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

需要注意的一点是,我们的数据集列表被命名为

代码语言:javascript
运行
复制
names(dfList)

# [1] "df1" "df2" "df3"

到目前一切尚好。我的问题是,我尝试将一个不同的转换函数应用到列表中,一个在每个数据集中的变量子集中添加前缀的函数。此函数需要创建一个前缀列表。

代码语言:javascript
运行
复制
preList <- dplyr::lst(one = "one", two = "two", three = "three")

现在要创建添加前缀的函数,请使用来自rename_with()dplyr函数

代码语言:javascript
运行
复制
renameCols <- function(d, prefix) d %>% rename_with(.fn = ~ paste0(prefix, .x), .cols = matches("x"))

现在,让我们将函数应用到上面创建的数据集列表中。

代码语言:javascript
运行
复制
dfList <- lapply(1:length(dfList), function(i) renameCols(dfList[[i]], preList[[i]]))

在它工作的列表中,x变量中添加了一个前缀。

代码语言:javascript
运行
复制
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函数将转换的数据集移回全局环境时,我们会得到一条错误消息。

代码语言:javascript
运行
复制
list2env(dfList, .GlobalEnv)

# Error in list2env(dfList, .GlobalEnv) : names(x) must be a character vector of the same length as x

我想我知道发生了什么,我的函数剥夺了dfList所需的名称,以便将列表中的每个元素移回全局环境中。

代码语言:javascript
运行
复制
names(dfList)

# NULL

我怀疑这是因为我在lapply()函数中使用了一个数字索引,而不是列表本身,但我不知道这是否是问题的真正根源,也不知道如何获得我需要的结果。

EN

回答 1

Stack Overflow用户

发布于 2022-03-01 05:57:53

您可以使用mget来避免临时列表,而重命名问题实际上要求使用Map

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
factorFunct <- function(d) transform(d, x=factor(x))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71304088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档