さまざまなタイプの列が多数あるデータフレームがあります。各列を対応するクラスのNAに置き換えたいと思います。
例えば:
df = data_frame(x = c(1,2,3), y = c("a", "b", "c"))
df[, 1:2] <- NA
数値と文字ではなく、2つの論理列を持つデータフレームを生成します。私はRに言うことができることを知っています:
df[,1] = as.numeric(NA)
df[,2] = as.character(NA)
しかし、すべての可能なタイプのNAを持つすべての列のループでこれをまとめて行うにはどうすればよいですか?
あなたはこの「トリック」を使うことができます:
_df[1:nrow(df),1] <- NA
df[1:nrow(df),2] <- NA
_
[1:nrow(df),]
は、基本的にRに列内のすべての値をNA
でreplaceするように指示します。このようにして、論理NA
は元の値に強制変換されます。他の値を置き換える前の列のタイプ。
また、置き換える列がたくさんあり、data_frameに行がたくさんある場合は、行インデックスを保存して再利用することをお勧めします。
_rowIdxs <- 1:nrow(df)
df[rowIdxs ,1] <- NA
df[rowIdxs ,2] <- NA
df[rowIdxs ,3] <- NA
...
_
@ RonakShah によって巧妙に提案されているように、次を使用することもできます:
_df[TRUE, 1] <- NA
df[TRUE, 2] <- NA
...
_
@ Cath で指摘されているように、複数の列を選択した場合でも、両方の方法が機能します。 :
_df[TRUE, 1:3] <- NA
# or
df[1:nrow(df), 1:3] <- NA
_
all列に適用される別の解決策は、非NAを指定し、NAに置き換えることです。
df[!is.na(df)] <- NA
これは、
# A tibble: 3 x 2 x y <dbl> <chr> 1 NA <NA> 2 NA <NA> 3 NA <NA>
変数のクラスを維持しながら、すべての列を一度に変更する別の方法:
df[] <- lapply(df, function(x) {type <- class(x); x <- NA; class(x) <- type; x})
df
# A tibble: 3 x 2
# x y
# <dbl> <chr>
#1 NA <NA>
#2 NA <NA>
#3 NA <NA>
@digEmAllがコメントで通知したように、別の同様の、しかしより短い方法があります。
df[] <- lapply(df, function(x) as(NA,class(x)))
dplyr :: na_ifを使用する:
library(dplyr)
df %>%
mutate(x = na_if(x, x),
y = na_if(y, y))
# # A tibble: 3 x 2
# x y
# <dbl> <chr>
# 1 NA NA
# 2 NA NA
# 3 NA NA
列のサブセットのみを[〜#〜] na [〜#〜]に変更する場合は、次のようにします。
# dataframe with extra column that stay unchanged
df = data_frame(x = c(1,2,3), y = c("a", "b", "c"), z = c(4:6))
df %>%
mutate_at(vars(x, y), funs(na_if(.,.)))
# # A tibble: 3 x 3
# x y z
# <dbl> <chr> <int>
# 1 NA NA 4
# 2 NA NA 5
# 3 NA NA 6
dplyr
からbind_cols()
を使用すると、次のこともできます。
df <- data_frame(x = c(1,2,3), y = c("a", "b", "c"))
classes <- sapply(df, class)
df[,1:2] <- NA
bind_cols(lapply(colnames(x), function(x){eval(parse(text=paste0("as.", classes[names(classes[x])], "(", df[,x],")")))}))
V1 V2
<dbl> <chr>
1 NA NA
2 NA NA
3 NA NA
これにより、列名が変更されることに注意してください。