データフレームがある場合、すべての行と列に沿って特定の値をすべて置き換える方法を教えてください。たとえば、すべての空のレコードをNA
で置き換えます(位置を入力せずに):
df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))
A B
1 12
2 xyz
3 jkl 100
期待される結果:
A B
1 NA 12
2 xyz NA
3 jkl 100
このような:
> df[df==""]<-NA
> df
A B
1 <NA> 12
2 xyz <NA>
3 jkl 100
PikkuKatjaとglallenがより一般的な解決策を求めており、まだコメントできないので、答えを書きます。次のようにステートメントを組み合わせることができます。
> df[df=="" | df==12] <- NA
> df
A B
1 <NA> <NA>
2 xyz <NA>
3 jkl 100
因子については、zxzakのコードはすでに因子を生成します。
> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)))
> str(df)
'data.frame': 3 obs. of 2 variables:
$ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2
$ B: Factor w/ 3 levels "","100","12": 3 1 2
問題が発生した場合は、一時的に要因を削除することをお勧めします。
df[] <- lapply(df, as.character)
以下に、いくつかのdplyr
オプションを示します。
library(dplyr)
# all columns:
df %>%
mutate_all(~na_if(., ''))
# specific column types:
df %>%
mutate_if(is.factor, ~na_if(., ''))
# specific columns:
df %>%
mutate_at(vars(A, B), ~na_if(., ''))
# or:
df %>%
mutate(A = replace(A, A == '', NA))
# replace can be used if you want something other than NA:
df %>%
mutate(A = as.character(A)) %>%
mutate(A = replace(A, A == '', 'used to be empty'))
Data.tableを使用して、すばやく取得できます。最初に因子なしでdfを作成し、
df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)
これで使用できます
setDT(df)
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)
そして、それをdata.frameに戻すことができます
setDF(df)
Data.frameのみを使用し、より困難な要素を保持したい場合は、
levels(df$value)[levels(df$value)==""] <- NA
ここで、valueはすべての列の名前です。ループに挿入する必要があります。
データフレーム内の複数の値を置換する場合は、すべての列をループ処理すると役立つ場合があります。
""
と100
を置き換えたいとします:
na_codes <- c(100, "")
for (i in seq_along(df)) {
df[[i]][df[[i]] %in% na_codes] <- NA
}