(ランダムな場所に)文字値(たとえば"foo"
)NA
に置き換えます。
データフレーム全体でこれを行う最良の方法は何ですか?
この:
df[ df == "foo" ] <- NA
芽にこれを挟む1つの方法は、最初にデータを読み込むときにその文字をNAに変換することです。
df <- read.csv("file.csv", na.strings = c("foo", "bar"))
別のオプションはis.na<-
:
is.na(df) <- df == "foo"
その使用は少し直感に反しているように見えるかもしれませんが、実際には、右側のインデックスでNA
にassignsdf
値を割り当てます。
これは、dplyr::mutate_all()
およびreplace
を使用して実行できます。
library(dplyr)
df <- data_frame(a = c('foo', 2, 3), b = c(1, 'foo', 3), c = c(1,2,'foobar'), d = c(1, 2, 3))
> df
# A tibble: 3 x 4
a b c d
<chr> <chr> <chr> <dbl>
1 foo 1 1 1
2 2 foo 2 2
3 3 3 foobar 3
df <- mutate_all(df, funs(replace(., .=='foo', NA)))
> df
# A tibble: 3 x 4
a b c d
<chr> <chr> <chr> <dbl>
1 <NA> 1 1 1
2 2 <NA> 2 2
3 3 3 foobar 3
別のdplyr
オプションは次のとおりです。
df <- na_if(df, 'foo')
dplyr::na_if
を使用すると、特定の値をNA
に置き換えることができます。この場合、それは"foo"
になります。
library(dplyr)
set.seed(1234)
df <- data.frame(
id = 1:6,
x = sample(c("a", "b", "foo"), 6, replace = T),
y = sample(c("c", "d", "foo"), 6, replace = T),
z = sample(c("e", "f", "foo"), 6, replace = T),
stringsAsFactors = F
)
df
#> id x y z
#> 1 1 a c e
#> 2 2 b c foo
#> 3 3 b d e
#> 4 4 b d foo
#> 5 5 foo foo e
#> 6 6 b d e
na_if(df$x, "foo")
#> [1] "a" "b" "b" "b" NA "b"
複数の列に対してこれを行う必要がある場合は、"foo"
からmutate_at
を渡すことができます。
df %>%
mutate_at(vars(x, y, z), na_if, "foo")
#> id x y z
#> 1 1 a c e
#> 2 2 b c <NA>
#> 3 3 b d e
#> 4 4 b d <NA>
#> 5 5 <NA> <NA> e
#> 6 6 b d e
解決する1つの代替方法は次のとおりです。
for (i in 1:ncol(DF)){
DF[which(DF[,i]==""),columnIndex]<-"ALL"
FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL"
}