循环遍历全局环境
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)
仅在 a
、b
等是具有自己值的变量时才有意义。
【参考方案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 我已经有了dfs
和index
,因此不必生成它:)。请参阅我的更改以更好地描述我的问题。谢谢!
@Rui Barradasindex
是一个列表,其中元素 #1 = index[1] = a
--> index= c(a, b, c, d, etc.). So
index$a``` 不起作用。
@Mcgroger 您还说 dfs 中的数据帧包含 NA,所以 list2env
不起作用。你可以说得更详细点吗? dfs 数据框列包含NA
's? list2env
有什么不适用的?以上是关于循环遍历全局环境的主要内容,如果未能解决你的问题,请参考以下文章