我有一个数据框列表,我想为其获取(在单独的数据框中)指定列的行平均值,该列可能存在于列表的所有数据框中,也可能不存在。当指定的列不存在于列表的至少一个数据框中时,我的问题就出现了。
假设以下示例数据帧列表:
df1 <- read.table(text = 'X A B C
name1 1 2 3
name2 5 10 4',
header = TRUE)
df2 <- read.table(text = 'X B C A
name1 8 1 31
name2 9 9 8',
header = TRUE)
df3 <- read.table(text = 'X B A E
name1 9 9 29
name2 5 15 55',
header = TRUE)
mylist_old <-list(df1, df2)
mylist_new <-list(df1, df2, df3)
假设我想
rowMeans
栏目 C
当数据框列表( mylist_old
)由元素 df1
组成时,以下代码可以完美运行和 df2
,:Mean_C <- rowMeans(do.call(cbind, lapply(mylist_old, "[", "C")))
Mean_C <- as.data.frame(Mean_C)
当列表由至少一个数据框组成时,问题就来了,其中列
C
不存在,在我的例子中就是 df3
,即列表 mylist_new
:Mean_C <- rowMeans(do.call(cbind, lapply(mylist_new, "[", "C")))
导致:“错误在
[.data.frame
(X[[i]], ...) : 选择了未定义的列规避此问题的一种方法是排除
df3
来自 mylist_new
.但是,我的真实程序有一个包含 64 个数据框的列表,我不知道列 C
存在与否。我要lapply
我的一段代码仅当列 C
被检测为存在,即将该命令应用于数据帧列表,但仅适用于存在列 C
的数据帧是真的。我试过这个
if("C" %in% colnames(mylist_new))
{
Mean_C <- rowMeans(do.call(cbind, lapply(mylist_new, "[", "C")))
Mean_C <- as.data.frame(Mean_C)
}
但是没有任何 react ,可能是因为
colnames
指的是列表而不是列表的每个数据框。对于 64 个数据帧,我无法“手动”引用每个数据帧,需要一个自动化程序。
最佳答案
这是 Filter
的一种选择list
元素,然后应用 lapply
在过滤 list
rowMeans(do.call(cbind, lapply(Filter(function(x) "C" %in% names(x),
mylist_new), `[[`, "C")))
#[1] 2.0 6.5
或使用
tidyverse
没有 Filter
ing,但利用 select
忽略列不存在的情况library(tidyverse)
map(mylist_new, ~ .x %>%
select(one_of("C"))) %>% # gives a warning
bind_cols %>%
rowMeans
#[1] 2.0 6.5
最好有一些关于该列不存在的警告
或者没有警告
map(mylist_new, ~ .x %>%
select(matches("^C$"))) %>%
bind_cols %>%
rowMeans
#[1] 2.0 6.5
关于r - 仅当列存在时才适用于数据框列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55881433/