对数据框中的非耐久列返回NA或NULL

时间:2012-06-19 09:36:20

标签: r dataframe

我正在寻找一种优雅的方法来返回列的值(如果它存在)和(向量)NANULL(如果不存在)。直接寻址会产生undefined columns错误,使用子集会产生0列数据帧。是否有一种优雅的内置方式,没有定义一个函数来做到这一点?

> example(data.frame)
# output omitted
> head(d, 1)
  x y fac
1 1 1   A
> head(d['x'], 1)
  x
1 1

# Works when accessing column using $
> head(d$z, 1)
NULL
# Not satisfactory
> head(d['z'], 1)
Error in `[.data.frame`(d, "z") : undefined columns selected
> head(d[colnames(d) == 'z'], 1)
data frame with 0 columns and 1 rows

编辑:当然这个单线程可以胜任。我正在寻找更多的R-ish方式。

> safe.index <- function(df, n)
     if (any(n %in% colnames(df))) df[n] else rep(NA, nrow(df))
> head(safe.index(d, 'z'), 1)
[1] NA

2 个答案:

答案 0 :(得分:3)

解决此问题的一种方法是在尝试子集之前测试'z'列名称中是否存在d

if('z' %in% names(d)){
  head(d['z'],1)
} else {
  NA
}

另一种方法是使用tryCatch和条件处理:

# Actually, the following line defining e isn't really necessary.
# e <- simpleError("stopped")
safe.index <- function(df, n){
  tryCatch(df[n], error = function(e)return(rep(NA, nrow(df))))
}
head(safe.index(d, 'z'), 1)
# [1] NA

head(safe.index(d, 'x'), 1)
#   x
# 1 1

一个潜在的缺点是,无论错误是什么,使用tryCatch的上述解决方案都会返回NA向量,而不仅仅是n不是列名。< / p>

答案 1 :(得分:2)

怎么样:

data <- data.frame(x = 1:2, y = 2:3, z = 3:4)
outCol <- function(df, name){
  unlist(ifelse(name %in% names(df),df[name],list(rep(NA,nrow(df)))))
}
outCol(data, 'x')
[1] 1 2
outCol(data, 'u')
[1] NA NA