web-dev-qa-db-ja.com

空白をNAに変更する関数

空の文字列をNAに変換する関数を記述しようとしています。私の列の1つの要約は次のようになります。

      a   b 
 12 210 468 

12個の空の値をNAに変更したいと思います。空の値をNAに変更したい他のいくつかの因子列もあるので、ここからあちこちにいくつかのものを借りてこれを思いつきました:

# change nulls to NAs
nullToNA <- function(df){

  # split df into numeric & non-numeric functions
  a<-df[,sapply(df, is.numeric), drop = FALSE]
  b<-df[,sapply(df, Negate(is.numeric)), drop = FALSE]

  # Change empty strings to NA
  b<-b[lapply(b,function(x) levels(x) <- c(levels(x), NA) ),] # add NA level
  b<-b[lapply(b,function(x) x[x=="",]<- NA),]                 # change Null to NA

  # Put the columns back together
  d<-cbind(a,b)
  d[, names(df)]
}

ただし、次のエラーが発生します。

> foo<-nullToNA(bar)  
Error in x[x == "", ] <- NA : incorrect number of subscripts on matrix  
Called from: FUN(X[[i]], ...)

私はここで見つかった答えを試しました: すべての0の値をNAに置き換えます ですが、すべての列が数値に変更されます。

8
Travis Heeter

論理条件に一致するフィールドに直接インデックスを付けることができます。だからあなたはただ書くことができます:

_df[is_empty(df)] = NA
_

ここで、_is_empty_は比較です。 _df == ""_:

_df[df == ""] = NA
_

ただし、is.null(df)は機能せず、とにかく奇妙です1。ただし、さまざまなタイプの列のロジックをマージしないことをお勧めします。代わりに、個別に処理してください。


1 基になるベクトルがNULLである場合にのみ機能するため、テーブル内でlistに遭遇することはほとんどありません。この制約を使用して行列とdata.framesを作成できますが、TRUEの値はリスト内にラップされるため、is.null(df)NULLになることはありません)。

10
Konrad Rudolph

どうですか:

df[apply(df, 2, function(x) x=="")] = NA

少なくとも簡単な例では、私にとってはうまくいきます。

1
juod

これは私のために働いた

    df[df == 'NULL'] <- NA
0
AMS

これは私がこの問題を解決するために使用した機能です。

null_na=function(vector){
  new_vector=rep(NA,length(vector))
  for(i in 1:length(vector))
    if(vector[i]== ""){new_vector[i]=NA}else if(is.na(vector[i])) 
      {new_vector[i]=NA}else{new_vector[i]=vector[i]}
  return(new_vector)
}

問題のあるカラムまたはベクターを接続するだけです。

0