r - 循环遍历全局环境
问题描述
我想遍历全局环境(仅数据帧)并添加到 .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
并向其添加一列,其中包含index
called的第一个元素的条目a
。对于中的第二个数据框dataframe2
,dfs
我想添加一个带有第二个元素的列,index
以此类推b
。
之后,我想将更新后的单独数据帧导出dfs
到 .GlobalEnv。但由于dfs
包含的单独数据框NA's
不适用于list2env(dfs, .GlobalEnv)
.
解决方案
我没有完全理解这个问题,但这是我认为接近它的问题。
首先,创建一些数据,因为问题中没有。
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)
推荐阅读
- angular - Angular + Jasmine:如何忽略/模拟测试组件中的一个函数(不在依赖项中)?
- elasticsearch - 弹性 SIEM + 谷歌云平台
- python-3.x - 根据其他列值获取列值的最小值
- sql - SQL 中的多个聚合从单个值的查询开始
- jenkins - groovy.lang.MissingPropertyException:没有这样的属性:类的ERROR_MESSAGE:groovy.lang.Binding
- python - python如何在for循环中执行2个条件?(用于比较列表)
- laravel - Laravel 1 行在插入和
- php - Docker MariaDB - mysql.proc 的列数错误。预期 X,找到 Y。使用 MariaDB 50731 创建,现在运行 100508
- android - 初始化复杂过滤器时出错 问题是什么?
- ios - 输入一个字符后关闭键盘