【问题标题】:Accessing column by name in data.frame: return NA if column doesn't exists在 data.frame 中按名称访问列:如果列不存在则返回 NA
【发布时间】: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


    【解决方案1】:

    我会使用match

    match(x = c("mpg", "disp", "blarg"), table = names(mtcars), nomatch = NA)
    # [1]  1  3 NA
    

    如果你写一个包装器,你不需要分别传递一个数据框和它的列:

    column_index <- function(data, column.names, value.if.not.exists = NA) {
        match(x = column.names, table = names(data), nomatch = value.if.not.exists)
    }
    

    编辑

    糟糕,我以为你想要列索引。您想返回一个完整的列。为此,您的功能看起来不错,我将其简化一下:

    TryGetColumn <- function(x, column.name, value.if.not.exists = NA) {
        if (column.name %in% names(x)) {
            return(x[, column.name])
        } 
        return(value.if.not.exists)
    }
    

    如果您经常使用它并且真的担心计算时间,那么一次检查一堆列名会更快(如我的答案的顶部),然后只提取那里的列从数据框中取出并根据需要制作尽可能多的NA 列。但是,如果您担心计算时间,我敢打赌,无论您在做什么,这个特定的步骤都不会拖慢您的速度。

    【讨论】:

    • @EldarAgalarov,那么你可以用同样的方式使用fastmatch::fmatch()
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多