我正在寻找一种优雅的方法来返回列的值(如果它存在)和(向量)NA
或NULL
(如果不存在)。直接寻址会产生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
答案 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