2016-12-19 7 views
0

everyone。私の仕事は、8つの列を持つ3つのデータセットをRで1つに結合し、次に: 1)列1-5から - すべての質問をNA に変換する必要があります。列1-5から、すべての文字列と非数値の回答を-2に変換する必要があります。より効率的な方法でデータをRに変換する

問題は、ファイルを読み込んでいるときに自動的にすべてが文字に変換されていて、as.numeric関数を適用すると不可能な数値に変換されているということですNAに文字列を変換すると同時に、後で何が追跡されるのかを追跡できなくなります。例えば

、私が持っている:私は出力として欲しい

Answer.1  Answer.2  Answer.3 
1 don't know <Unanswered> 5 
2 4    a-1   <Unanswered> 
3 1    5    4 

はこれです:

Answer.1  Answer.2  Answer.3 
1 -2  NA    5 
2 4  -2    NA 
3 1   5    4 

私はこの醜いコード入力することで解決策を見つけるために管理しました:

copy <- bind_rows(group1, group2, group3) 


copy[, 1:5] <- gsub("<Unanswered>", "5000", copy[,1:6]) 

copy$Answer.1 <- gsub("<Unanswered>", "5000", copy$Answer.1) 
copy$Answer.2 <- gsub("<Unanswered>", "5000", copy$Answer.2) 
copy$Answer.3 <- gsub("<Unanswered>", "5000", copy$Answer.3) 
copy$Answer.4 <- gsub("<Unanswered>", "5000", copy$Answer.4) 
copy$Answer.5 <- gsub("<Unanswered>", "5000", copy$Answer.5) 

copy$Answer.1 <- as.numeric(copy$Answer.1) 
copy$Answer.2 <- as.numeric(copy$Answer.2) 
copy$Answer.3 <- as.numeric(copy$Answer.3) 
copy$Answer.4 <- as.numeric(copy$Answer.4) 
copy$Answer.5 <- as.numeric(copy$Answer.5) 

copy[is.na(copy)] <- -2 
copy[copy == 5000] <- NA 

しかし、これを行うより効率的な方法があるのだろうかと私は不思議です。私たちの割り当てでは、dplyrやtidyr以外のパッケージを使用することはできません。

+1

私はかなり完全に疑問を取得できませんでしたが、あなたはあなたのファイルを読むためにread.csv()を使用している場合、あなたは「na.strings」パラメータを使用することができます読みたい文字列をNAに変換します。 – krish

+0

すべてを文字列として自動的に読み取らないようにするには、readAs.csv()関数内でstringsAsFactors = FALSEを使用できます。 – krish

+0

私は両方のものを試しましたが、まだ動作していません。 – Assen

答えて

0

コメントの尋ねられた質問への解決策。

n <- cbind(apply(n[,1:5], 2 , function(x) ifelse(x > 24, -2, x)), n[,6]) 
#Output 
     n1 n2 n3 n4 n5 
[1,] 2 2 2 2 2 2 
[2,] 4 4 4 4 4 4 
[3,] 6 6 6 6 6 6 
[4,] 8 8 8 8 8 8 
[5,] 10 10 10 10 10 10 
[6,] 12 12 12 12 12 12 
[7,] 14 14 14 14 14 14 
[8,] 16 16 16 16 16 16 
[9,] 18 18 18 18 18 18 
[10,] 20 20 20 20 20 20 
[11,] 22 22 22 22 22 22 
[12,] 24 24 24 24 24 24 
[13,] -2 -2 -2 -2 -2 26 
[14,] -2 -2 -2 -2 -2 28 
[15,] -2 -2 -2 -2 -2 30 
[16,] -2 -2 -2 -2 -2 32 
[17,] -2 -2 -2 -2 -2 34 
[18,] -2 -2 -2 -2 -2 36 
[19,] -2 -2 -2 -2 -2 38 
[20,] -2 -2 -2 -2 -2 40 
[21,] -2 -2 -2 -2 -2 42 
[22,] -2 -2 -2 -2 -2 44 
[23,] -2 -2 -2 -2 -2 46 
[24,] -2 -2 -2 -2 -2 48 
[25,] -2 -2 -2 -2 -2 50 

ここでのnは、データセットの名前であり、私は唯一の6列があると仮定しています。データセットに応じて変更することができます。

簡単な解決策は次のようになります。

n[1:5] <- lapply(n[1:5], function(x) ifelse(x > 24, -2, x)) 
+0

事前に関数を作成することをお勧めしますか?私はそこに機能しているものは得られません、ありがとう! :) – Assen

+0

apply/lapply/sapplyのドキュメントを読んで、その動作を理解することをお勧めします。あなたはドキュメントのためにコンソールに?applyを使うことができます。 – krish

+0

@Assen - この回答があなたの問題の解決に役立つ場合は、投票矢印の下にあるチェックマークを使用して[受け入れられるとマークする](https://stackoverflow.com/help/someone-answers)を検討してください。ありがとうございました! – krish

関連する問題