web-dev-qa-db-ja.com

Rデータフレームで空の文字列をNAに置き換える方法は?

私の最初のアプローチは、csvからデータを読み取るときに_na.strings=""_を使用することでした。これは何らかの理由で機能しません。私も試しました:

_df[df==''] <- NA
_

これによりエラーが発生しました:列のインデックス付けに行列または配列を使用できません。

私はカラムだけを試しました:

_df$col[df$col==''] <- NA
_

これにより、空の文字列以外に値がある場合でも、データフレーム全体のすべての値がNAに変換されます。

次に、_mutate_all_を使用しようとしました:

_replace.empty <- function(a) {
    a[a==""] <- NA
}

#dplyr pipe
df %>% mutate_all(funs(replace.empty))
_

これにより、データフレーム全体のすべての値もNAに変換されます。

最初の方法は効果がなかったので何がわからないので、「空の」文字列について何かがおかしいと思います。

EDIT(MKRのリクエストによる)dput(head(df))の出力:

_structure(c("function (x, df1, df2, ncp, log = FALSE) ", "{",
"    if (missing(ncp)) ", "        .Call(C_df, x, df1, df2, log)",
"    else .Call(C_dnf, x, df1, df2, ncp, log)", "}"), .Dim = c(6L,
1L), .Dimnames = list(c("1", "2", "3", "4", "5", "6"), ""), class = 
"noquote")
_
9
mp3242

なぜかわかりませんdf[df==""]<-NAOPでは機能しませんでした。サンプルのdata.frameを取り、オプションを調べてみましょう。

オプション#1: Base-R

df[df==""]<-NA

df
#    One  Two Three Four
# 1    A    A  <NA>  AAA
# 2 <NA>    B    BA <NA>
# 3    C <NA>    CC  CCC

Option#2: 1dplyr :: mutate_all1およびna_if。またはmutate_ifデータフレームに複数のタイプの列がある場合

library(dplyr)

mutate_all(df, list(~na_if(.,"")))

OR

#if data frame other types of character Then
df %>% mutate_if(is.character, list(~na_if(.,""))) 

#    One  Two Three Four
# 1    A    A  <NA>  AAA
# 2 <NA>    B    BA <NA>
# 3    C <NA>    CC  CCC

おもちゃのデータ:

df <- data.frame(One=c("A","","C"), 
                 Two=c("A","B",""), 
                 Three=c("","BA","CC"), 
                 Four=c("AAA","","CCC"), 
                 stringsAsFactors = FALSE)

df
#   One Two Three Four
# 1   A   A        AAA
# 2       B    BA     
# 3   C        CC  CCC
25
MKR