2017-06-02 8 views
1

RのデータフレームでNAsを再分類しようとしています。文字の値または要素の場合はvlaue、数字または整数の場合はvlaueにします。私は次のif文を思いついたが、何らかの理由で私は離れている。これを行う最善の方法は何ですか?データ型を指定してNAsを処理する最良の方法

for(i in ncol(df_eng)) { 
    if(class(df_eng[,i]) == "integer") { 
    is.na(df_eng[,i]) <- 10219300 
    } 
    else if(class(df_eng[,i]) == "numeric") { 
    is.na(df_eng[,i]) <- 10219300 
    } 
    else { 
    is.na(df_eng[,i]) <- "ABCDEF" 
    } 
} 

Error in `[<-.data.frame`(`*tmp*`, , i, value = c("2017-05-26 18:20:20", : 
    replacement has 791 rows, data has 790 
+0

「is.na」での割り当ては正しくないと思います。 'v1 < - c(1、2、NA、3)をチェックする。 is.na(v1)< - 5' df_eng [、i] [is.na(df_eng [、i])] < - 10219300' – akrun

答えて

1

2つの問題があります。 1つはis.naの割り当てエラーです。いくつかのNAが

v1 <- c(1, 2, NA, 3) 

値で、我々はベクトルを持っている、と仮定し、OPのポストのように割り当てを行う

is.na(v1) <- 5 
v1 
#[1] 1 2 NA 3 NA 

これは5位にNA要素を割り当て、同様に

is.na(v1) <- 10 
v1 
#[1] 1 2 NA 3 NA NA NA NA NA NA 

目的とする動作が、NA要素をある値で置き換えることであるとすると、5

v2 <- c(1, 2, NA, 3) 
v2[is.na(v2)] <- 5 
v2 
#[1] 1 2 5 3 

及び第二のループは、ループがncol(df_eng)に貼り付けられていることに注意して、OPのコード例も

for(i in seq_len(ncol(df_eng))) { 
    if(class(df_eng[,i]) == "integer") { 
     df_eng[,i][is.na(df_eng[,i])] <- 10219300 
} else if(class(df_eng[,i]) == "numeric") { 
     df_eng[,i][is.na(df_eng[,i])] <- 10219300 
    } else { 
    df_eng[,i][is.na(df_eng[,i])] <- "ABCDEF" 
    } 
    } 

に同じロジックを適用する、すなわちncol(df_eng)


最後の列にループされます。 1:ncol(df_eng)以上、正しくはseq_len(ncol(df_eng))のいずれかで、data.frameの場合はseq_along(df_eng)

+1

ありがとう!これは素晴らしいフィードバックです – mangodreamz

関連する問題