2016-06-22 3 views
3

参加者が10個の質問のそれぞれに同じ応答をしたかどうかを教えてくれる二分変数を作成します。各行は参加者であり、データフレームにこの新しい変数/ベクトルを作成するための簡単なスクリプトを作成します。たとえば、私のデータが最初の6列のように見える場合、私は7番目の列を作成しようとしています。ストレートライニングをチェックするためにRスクリプトを書くにはどうすればいいですか?つまり、任意の行に対して、列のセット内のすべての値が同じ値を持つかどうかを確認します。

ID Item1 Item2 Item3 Item4 Item5 | AllSame 
1 5  5  5  5  5  | Yes 
2 1  3  3  3  2  | No 
3 2  2  2  2  2  | Yes 
4 5  4  5  5  5  | No 
5 5  2  3  5  5  | No 

私はifelse(data$item1==data$item2,1,ifelse(dat$item1==data$item3,0,NA))とここたとえば、別の列を比較し、このセットのソリューションを見てきましたが、私は私の実際のデータセットの10個の列を持っていると私はすべてのチェックをより良い方法があるように持って把握10を互いに対抗させる。私はまた、いくつの等価1を数える変数を作成することができますし、その数が列の数と同じであるかどうかのテストを行いますが、データ内で7つの可能な応答があります。誰かがより良い解決策を望むことを望む。ありがとうございました!

+0

おそらく統計よりむしろプログラミングであるため、stackoverflowの方が良いかもしれません – Henry

+0

"NA"の値がすべて1つの行に含まれていると、どのように振る舞いますか? –

+0

[単一ベクトルのすべての要素の間で等しいかどうかのテスト]の可能な複製(http://stackoverflow.com/questions/4752275/test-for-equality-among-all-elements-of-a-single-vector) –

答えて

4

あり、これを行うための多くの方法でもよいが、ここでは

> mydf 
    Item1 Item2 Item3 Item4 Item5 AllSame 
1  5  5  5  5  5 TRUE 
2  1  3  3  3  3 FALSE 
3  2  2  2  2  2 TRUE 
4  5  4  5  5  5 FALSE 
5  5  2  3  5  5 FALSE 

につながる1

mydf <- data.frame(Item1 = c(5,1,2,5,5), 
        Item2 = c(5,3,2,4,2), 
        Item3 = c(5,3,2,5,3), 
        Item4 = c(5,3,2,5,5), 
        Item5 = c(5,3,2,5,5)) 

mydf$AllSame <- rowMeans(mydf[,1:5] == mydf[,1]) == 1 

であり、あなたが本当に「はい」と持っている必要があります場合は「いいえ」、代わりに使用します。何かのように

mydf$AllSame <- ifelse(rowMeans(mydf[,1:5] == mydf[,1]) == 1, "Yes", "No") 
+0

これはうまくいきました。ちょうど私がやって来たかったです、ありがとう!私はすべてYesとNoは必要ありませんが、あなたがそのスクリプトを投稿してから解析が簡単になるので、1と0に変更しました。 '== mydf [、1]'の数字は、最初に見たカラムでなければなりません。私はそれが何をしているのか分からず、私の反応はすべて最初は0だったので、1としました。例えば。私の最終的なコードは 'data $ SL_set1 < - ifelse(rowMeans(data [、28:37] == data [、28])== 1、1、0)' – Bofstein

+0

私はこの数式の仕組みを理解しようとしていますだから私はまだそれを修正するのに十分なことを理解している。文字列変数(私はこれができるとは思えません)や欠損データのために。 5列の平均が最初の列と同じ値であるかどうかを確認していますか?平均値が最初の値と同じであれば、それは問題になるでしょうか?私はそれが多くの誤認を招くためではないと推測していますが、私は数式の仕組みを理解していません。行にNAがなければTRUEにしておきたいので、どこかにna.omitを広告する必要があると思っています。 – Bofstein

+0

これは、指定された列のすべての値が、指定された列の対応する値とすべて等しいかどうかをチェックします(指定された列のTRUEのセット、つまり$ 1 $ sの平均とその平均それらがすべてTRUEならば1です)。それは文字列変数ではなく、要素でない限り動作します。行にNAがある場合は、TRUEまたはFALSEではなくNAを与えます。 – Henry

0

Henryは既に受け入れられている短くて速い作業ソリューションを投稿しました。

mydf <- data.frame(Item1 = c(5,1,2,5,5), 
        Item2 = c(5,3,2,4,2), 
        Item3 = c(5,3,2,5,3), 
        Item4 = c(5,3,2,5,5), 
        Item5 = c(5,3,2,5,5)) 

mydf$AllSame <- apply(mydf, 1, function(row) all(row==row[1])) 

したい場合は、ここで使用されるすべての()関数は、簡単にTRUEに設定することができna.rm引数を持っている:私はまだ私の意見では、読みやすさにわずかな利点を有しており、この選択肢を追加したいですNAsは無視される。

関連する問題