2017-01-19 15 views
0

Rプログラミングにとって非常に新しく、データのクリーンアップに取り組んでいます。私は、複数の列を持つデータを持つcsvファイルをアップロードしました。Rプログラミング:複数の列の値を置換する

データの特性は基本的にはyes/noですが、 '1'、 '2'、 '3'、 '4'とコード化されています。実際に '2'、 '3'、 '4'の値は意味がありません。値が0かどうかを示すだけです(値が0の場合は0、値の場合はno)

カラム

summary(data$P_FandB) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
     1  1  1  1  1  1  54 
summary(data$P_ITMobile) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
     2  2  2  2  2  2  362 
summary(data$P_Electronic) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
     3  3  3  3  3  3  420 
summary(data$P_Furniture) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
     4  4  4  4  4  4  432 

私は交換したいデータの要約、NA 1と0の値2、図3に示すように、データセット内のこれら選択列の4。 1、2、3、4をコードする他の列がありますが、それはデータセットに意味を持つコードです。

これは、R、3、4の値を1に置き換えるためのRプログラミングで行うことです。

data$P_FandB[which(data$P_FandB>1)]=1 
data$P_ITMobile[which(data$P_ITMobile>1)]=1 
data$P_Electronic[which(data$P_Electronic>1)]=1 
data$P_Furniture[which(data$P_Furniture>1)]=1 

私は1とNAに変換するための100の変数があります。

これらのデータを消去するにはどうすればいいですか?

ありがとうございました。

+0

- lapply(データ[selcols]、機能(x)の置き換え(x、x> 1,1)) ' – akrun

答えて

0

我々は、選択された列をループにlapplyを使用し、非NAおよびNAのための1と0の値を置き換えるそれぞれ

selCols <- c("P_FandB", "P_ITMobile", "P_Electronic", "P_Furniture") 

または列のインデックスを使用し、背面に出力を割り当てることができ関心のある列。

data[selCols] <- lapply(data[selCols], function(x) as.integer(!is.na(NA))) 

または任意のループせず、論理行列に選択された列でデータセットを変換することは、バイナリ(+)にそれを強制し、選択した列にそれをバック割り当てます。

data[selCols] <- +(!is.na(data[selCols])) 

またはより高速なオプションがdata.tableだろう。 'data.frame'を 'data.table'(setDT(data))に変換し、.SDcolsに関心のある列を指定し、data.table(.SD)のサブセットをループし、最初の解決方法のように値を置き換えて、(:= )そのバック関心の列に

library(data.table) 
setDT(data)[, (selCols) := lapply(.SD, function(x) 
       as.integer(!is.na(NA))), .SDcols = selCols] 
0

我々はlapply()を持つ変数をループ可能性があり、0NAを変換するには、ネストされたifelse()を使用して1> 1値。

変数の名前のベクトルを作成するか(@ akrunの答えでselColsを参照)、データセット内の列の位置を使用するだけです。

data[2:101] <- lapply(data[2:101], function(x) ifelse(is.na(x), 0, ifelse(x > 1, 1, 1))) 

小さな例:あなたは `replace`または` ifelse`すなわち `データ[selcols] <と` lapply`を使用することができます

data <- data.frame(x = c(1,2,3,4), y = c(1, NA, 3, 4)) 

    x y 
1 1 1 
2 2 NA 
3 3 3 
4 4 4 

data[1:2] <- lapply(data[1:2], function(x) ifelse(is.na(x), 0, ifelse(x > 1, 1, 1))) 

    x y 
1 1 1 
2 1 0 
3 1 1 
4 1 1 
関連する問題