2

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っぽい方法を探しています。

> 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
4

2 に答える 2

3

これを行う 1 つの方法は、この場合、サブセット化を試みる前に'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

潜在的な欠点の 1 つは、上記のソリューションを使用すると、列名ではない場合だけでなく、エラーに関係なくベクトルtryCatchが返されることです。NAn

于 2012-06-19T09:59:03.680 に答える
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
于 2012-06-19T09:58:32.447 に答える