2017-12-24 11 views
0

データフレーム内の特定の列に対してNAsをゼロに置き換えるループを作成しようとして多くの時間を費やしましたが、まだ成功していません。私は検索し、同様の質問を見つけることができません。データフレーム内でNAsを0に置き換える特定の列をループする

df <- data.frame(A = c(2, 4, 6, NA, 8, 10), 
      B = c(NA, 10, 12, 14, NA, 16), 
      C = c(20, NA, 22, 24, 26, NA), 
      D = c(30, NA, NA, 32, 34, 36)) 
df 

は私を与える:

A B C D 
1 2 NA 20 30 
2 4 10 NA NA 
3 6 12 22 NA 
4 NA 14 24 32 
5 8 NA 26 34 
6 10 16 NA 36 

私は私ができる、別々のコード行を使用した列のみBとDのために0にNASに設定したい:

df$B[is.na(df$B)] <- 0 
df$D[is.na(df$D)] <- 0 

しかし、私が欲しいです実際のデータセットには多くの変数があるため、ループを使用することができます。

私は私が得る唯一の列BとDをループする方法を見つけることができません。

df 

    A B C D 
1 2 0 20 30 
2 4 10 NA 0 
3 6 12 22 0 
4 NA 14 24 32 
5 8 0 26 34 
6 10 16 NA 36 

基本的に、私は、データフレームに変数のリストを使用してループを適用する:

varlist <- c("B", "D") 

変数リストを使ってデータフレーム内の特定の列のみをループして、NSをゼロに置き換える方法はありますか?

+3

ループは必要ないのです。 'df [varlist] < - replace(df [varlist]、is.na(df [varlist])、0)'を実行すると、 – Sotos

答えて

1

zooパッケージを使用すると、選択した列を入力できます。ベースRで

library(zoo) 
df[varlist]=na.fill(df[varlist],0) 
    df 
    A B C D 
1 2 0 20 30 
2 4 10 NA 0 
3 6 12 22 0 
4 NA 14 24 32 
5 8 0 26 34 
6 10 16 NA 36 

我々はここで

df[varlist]=lapply(df[varlist],function(x){x[is.na(x)]=0;x}) 
    df 
    A B C D 
1 2 0 20 30 
2 4 10 NA 0 
3 6 12 22 0 
4 NA 14 24 32 
5 8 0 26 34 
6 10 16 NA 36 
3

を持つことができますtidyverse aproachです:

library(tidyverse) 
df %>% 
    mutate_at(.vars = vars(B, D), .funs = funs(ifelse(is.na(.), 0, .))) 
#output: 
    A B C D 
1 2 0 20 30 
2 4 10 NA 0 
3 6 12 22 0 
4 NA 14 24 32 
5 8 0 26 34 
6 10 16 NA 36 

基本的にあなたがVARSのBとDは、定義された関数によって変更する必要がありますと言います。ここで、.は該当する列に対応します。

2

はここで、ベースRワンライナー

df[, varlist][is.na(df[, varlist])] <- 0 
関連する問題