【发布时间】:2019-09-16 18:48:36
【问题描述】:
我有一个数据帧列表,我想(在单独的数据帧中)获取指定列的行平均值,该列可能存在或不存在于列表的所有数据帧中。当列表的至少一个数据框中不存在指定的列时,我的问题就出现了。
假设以下数据框示例列表:
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)
当列表由至少一个数据框组成时,问题就来了
Mean_C <- rowMeans(do.call(cbind, lapply(mylist_new, "[", "C")))
导致:“[.data.frame(X[[i]], ...) 中的错误:选择了未定义的列
规避此问题的一种方法是将df3 从mylist_new 中排除。但是,我的真实程序有一个包含 64 个数据框的列表,我不知道列 C 是否存在。仅当检测到列C 存在时,我才想lapply 我的代码段,即将该命令应用于数据帧列表,但仅适用于存在C 列的数据帧为真。
我试过了
if("C" %in% colnames(mylist_new))
{
Mean_C <- rowMeans(do.call(cbind, lapply(mylist_new, "[", "C")))
Mean_C <- as.data.frame(Mean_C)
}
但是什么也没发生,可能是因为colnames 指的是列表,而不是列表中的每个数据框。有 64 个数据框,我不能“手动”引用每个数据框,需要一个自动化的过程。
【问题讨论】:
标签: r if-statement conditional-statements lapply