2016-09-14 8 views
0

私はQualtricsの調査回答をいくつか使ってRのデータを分析しています。一つの質問、多重回答の多項選択問題、コンマで区切って1つのセルにします。たとえば、選択肢4,7および10を選択した人物は、「4,7,10」または「10,4,7」、Rの文字ベクタに見える出力を出力します。選択肢は、応答、何らかの理由で。R - カンマで区切った数値を複数のバイナリ値の列に変更する方法

splitstackshapeパッケージの「cSplit」コマンドを使用して、これらの値をすべて複数の列に分割することができました。可能な選択肢は22通りあり、1つの列(IMと呼ぶ)は、それぞれが1つの値(たとえば、IM_01、IM_02 ... IM_22)を保持する22の異なる列に分割されていました。

「10,4,7」、IM_01 = 10、IM_02 = 4、IM_03 = 7、およびIM_04〜IM_22として出てきた例の応答はNAです。だから、ここで問題となるのは、すべての4が1つの列にはなく、7やその他の値でもないということです。それらはカンマで区切られた形式で最初に表示された順序で列にあります。

ここでは、私が扱っているものの例として、簡略化した小さなdfを示します。この例では7つの選択肢があります。それらをソートする

exampledf <- data.frame(ID = 1:3, Response = c("4,7,10", "7,5,16,8", "2,10"), 
stringsAsFactors = FALSE) 

    ID Response 
1 1 4,7,10 
2 2 7,5,16,8 
3 3  2,10 

良い方法は、私が想像して、それぞれの可能な選択肢のための一つの列を作り、それがその行の選択肢のうちの1つに対応する場合は、1にその列のセルを設定することです。意図した結果は次のようになります。

ID Response IM2 IM4 ... IM10 IM16 
1 1 4,7,10 NA  1   1 NA 
2 2 7,5,16,8 NA NA   NA  1 
3 3  2,10 1 NA   1 NA 

は今、私は次のコードを使用して1列にこれを行う方法見つけた:

exampledf$IM4 <- NA 

within(exampledf, IM4[IM_02 == 4 | IM_04 == 4 | IM_05 == 4 
        | IM_07 == 4 | IM_08 == 4 | IM_10 == 4 
        | IM_16 == 4 <- 1) 

をしかし、私は実行する方法を見つけることができませんコードを何度もコピーアンドペーストしたり、コピーされたブロックごとに論理ステートメントを変更したりすることなく、一度にすべての列に対して実行できます。私はまた...関数に

assignment <- function(cat, n) { 
within(exampledf, cat[IM_02 == n | IM_04 == n | IM_05 == n 
        | IM_07 == n | IM_08 == n | IM_10 == n 
        | IM_16 == n <- 1) 

これを回してみました...しかし、私は正常に機能への2つの引数(カテゴリおよびカテゴリ番号)を渡す方法を見つけ出すことはできません。

これを達成する方法について、私が始めた機能または全く別の方法のいずれかを使用していますか?

ありがとうございます!

+0

2番目のdup(http://stackoverflow.com/questions/16267552/dummy-variables-from-a-string-variable) – HubertL

答えて

1

スプリットカンマで応答ベクトル:

exampledf$split_responses <- sapply(exampledf$Response,function(x) as.numeric(unlist(strsplit(x,',')))) 

は、個々のデータフレームに各ID-応答ベクトルペアを作曲し、それらを行単位連結:

xx = do.call(rbind,apply(exampledf,1,function(x) data.frame(x$ID, x$split_responses))) 

がどのような値の列を追加します取るべき列が好き:

xx$value = 1 

そして希望する形になるようにtidyrを使います形状:

library(tidyr) 
spread(xx,key=x.split_responses,value=value) 

    x.ID 2 4 5 7 8 10 16 
1 1 NA 1 NA 1 NA 1 NA 
2 2 NA NA 1 1 1 NA 1 
3 3 1 NA NA NA NA 1 NA 
関連する問題