【发布时间】:2015-03-24 21:21:44
【问题描述】:
有没有更有效的方法来通过名称检查列是否存在,如果存在则返回列,如果不存在则返回 na?
现在我正在使用以下功能:
TryGetColumn <- function(x, column.name, column.names, value.if.not.exists) {
if (column.name %in% column.names) {
x[, column.name]
} else {
value.if.not.exists
}
}
df <- data.frame(a = 1:5, b = 6:10)
col.names <- colnames(df)
ab <- TryGetColumn(df, "a", col.names, NA) + TryGetColumn(df, "b", col.names, NA)
ac <- TryGetColumn(df, "a", col.names, NA) + TryGetColumn(df, "c", col.names, NA)
ab
#[1] 7 9 11 13 15
ac
#[1] NA NA NA NA NA
编辑: 根据Gregor's的回答,我改写了以下代码:
col.names <- c("a", "b", "c")
col.matches <- as.list(col.names %in% colnames(df))
names(col.matches) <- col.names
TryGetColumn <- function(col.name) if (col.matches[[col.name]]) df[, col.name] else NA
ab <- TryGetColumn("a") + TryGetColumn("b")
ac <- TryGetColumn("a") + TryGetColumn("c")
现在它基于关联数组(列表),应该比每次TryGetColumn 调用的线性查找更快。
【问题讨论】:
标签: r dataframe lookup na columnname