循环遍历全局环境

Posted

技术标签:

【中文标题】循环遍历全局环境【英文标题】:Iterating trough global environment with loop 【发布时间】:2019-11-20 13:12:29 【问题描述】:

我想遍历全局环境(仅数据框)并向 .GlobalEnv 中的每个数据框添加一列。此外,此列的条目依赖于列表index

因此,我想为 dataframe1 获取一个带有条目 index[1] 的新列。对于dataframe2,我想要一个包含index[2] 条目的列,依此类推。 此外,应直接对 .GlobalEnv 中的对象进行更改,因为数据帧包含 NA,因此我无法使用 list2env(dfs, .GlobalEnv) 导出它们。

我的尝试:

index = c(a, b, c, d)
dfs = lapply(filenames, get) # dfs is a list of all the dataframes in the .GlobalEnv

for (i in index)
dfs = lapply(dfs, transform, Index = index[i])


list2env(dfs, envir = .GlobalEnv)

循环运行,但不会更改 dfs 中的任何内容,我不明白为什么。 对于list2env,我收到错误消息:

"Error in list2env(dfs, envir = .GlobalEnv) : 
  names(x) must be a character vector of the same length as x"

因为数据帧中有NA's

是否有一种更直接的方法可以直接更改 .GlobalEnv 中的数据帧,以及如何正确地遍历数据帧列表,其中每个数据帧都会更改一个条目(基于 index 列表)?

我检查了有关 .GlobalEnv 中的迭代的问题,但似乎没有真正使条目依赖于通过另一个列表进行迭代。

提前谢谢你:)

变化:


对不起,我的描述不好。我有一个名为dfs 的数据框列表。 该列表包含 n=78 个单独的数据帧。然后我有第二个列表index,其中包含 n=78 个“字符”条目。 我的意图是获取dfs 的第一个元素,称为dataframe1,并在其中添加一个列,其中包含index 的第一个元素的条目,称为a。对于dfs 中的第二个数据框dataframe2,我想添加一列,其中包含index 的第二个元素,称为b,依此类推。

之后,我想将更新后的dfs 的单独数据帧导出到 .GlobalEnv。但由于dfs 中的单独数据帧包含NA's,因此不适用于list2env(dfs, .GlobalEnv)

【问题讨论】:

请注意,c(a, b, c, d) 仅在 ab 等是具有自己值的变量时才有意义。 【参考方案1】:

我没有完全理解这个问题,但这是我认为接近它的问题。

首先,创建一些数据,因为问题中没有。

a <- 1
b <- 2
c <- 3
d <- 4
z <- 5

index <- c(a, b, c, d, z)

df1 <- iris
mt <- mtcars
diamonds <- as.data.frame(ggplot2::diamonds)

现在,更改上面的数据框(注意只有 3 个 df)并分配回全局环境。

objs <- ls()
lst <- mget(objs)
inx <- sapply(lst, class) == "data.frame"
objs <- objs[inx]
lst <- lst[inx]
lst <- lapply(seq_along(objs), function(i)
  DF <- lst[[i]]
  DF$Index <- index[[i]]
  DF
)
names(lst) <- objs
list2env(lst, envir = .GlobalEnv)
rm(lst)

【讨论】:

@Rui Barradas 我已经有了dfsindex,因此不必生成它:)。请参阅我的更改以更好地描述我的问题。谢谢! @Rui Barradasindex 是一个列表,其中元素 #1 = index[1] = a --> index= c(a, b, c, d, etc.). So index$a``` 不起作用。 @Mcgroger 您还说 dfs 中的数据帧包含 NA,所以 list2env 不起作用。你可以说得更详细点吗? dfs 数据框列包含NA's? list2env 有什么不适用的?

以上是关于循环遍历全局环境的主要内容,如果未能解决你的问题,请参考以下文章

嵌套循环结合修改IFS环境变量遍历文件数据中IFS的修改一致性

使用 Talend 循环遍历 .csv 文件

forEach循环遍历请求接口

js 循环遍历变量的几种方式

外循环遍历每一行,嵌套循环遍历每个字符

JS for循环遍历点击事件