web-dev-qa-db-ja.com

同じタイプのNAを列に入力する関数

さまざまなタイプの列が多数あるデータフレームがあります。各列を対応するクラスの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を持つすべての列のループでこれをまとめて行うにはどうすればよいですか?

17
Omry Atia

あなたはこの「トリック」を使うことができます:

_df[1:nrow(df),1] <- NA
df[1:nrow(df),2] <- NA
_

[1:nrow(df),]は、基本的にRに列内のすべての値をNAreplaceするように指示します。このようにして、論理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
_
10
digEmAll

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> 
8
Sotos

変数のクラスを維持しながら、すべての列を一度に変更する別の方法:

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)))
5
Cath

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
4
zx8754

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 

これにより、列名が変更されることに注意してください。

0
alex_555