首页 > 解决方案 > 循环遍历全局环境

问题描述

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

结果,我想获得dataframe1一个带有条目的新列index[1]。因为dataframe2我想要一个带有条目index[2]等的列。此外,应直接对 .GlobalEnv 中的对象进行更改,因为数据框包含NA,因此我无法使用 .GlobalEnv 导出它们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, called的第一个元素dataframe1并向其添加一列,其中包含indexcalled的第一个元素的条目a。对于中的第二个数据框dataframe2dfs我想添加一个带有第二个元素的列,index以此类推b

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

标签: riteration

解决方案


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

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

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)

推荐阅读