r - 仅当列存在时才适用于数据框列表

标签 r if-statement conditional-statements lapply

我有一个数据框列表,我想为其获取(在单独的数据框中)指定列的行平均值,该列可能存在于列表的所有数据框中,也可能不存在。当指定的列不存在于列表的至少一个数据框中时,我的问题就出现了。

假设以下示例数据帧列表:

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/

相关文章:

r - R 中 gstat 包中 krige 花费的时间

java - 如何在不编写多个 if 语句或 try block 的情况下跳过对象中的空项?

enums - 如何有条件地检查枚举是一种变体还是另一种变体?

if-statement - COBOL-Record 正在被替换而不是添加

c - 为什么这有效

java - 是否有更有效的方法来比较 If 语句中的 3 个以上项目?

r - : Run code first time a package is installed or used

R如何使用另一个列表对列表进行子集化

r - 基于 R 中另一个数据框中的多列删除数据框中的行

c++ - 如何使用迭代器?