2016-08-02 14 views
2

数値に変換したいリカートアイテムに対して90個の応答を持つデータセットがあります。それは、ここでの例のように構成されていますリッカートデータを数値データに変換する

q6 <- c("Daily", "Never", "Often", "Very Often", "Daily") 
q7 <- c("Never", "Never", "Often", "Often", "Daily") 
q23 <- c("Daily", "Often", "Never", "Never", "Neutral") 
q17 <- c("Important", "Important", "Very Important", "Neutral", "Not Important") 
example <- cbind(q6, q7, q17, q23) 

各質問への回答は多少異なるが、いずれかのメインに強く強くデイリーは決してに、または重要でないと重要、同意する同意しないの範囲内にあります。 90の質問に対する回答のそれぞれは、別々の列にあります(q1> q90と表示されます)。私は、テキスト応答に対応する数値で応答セット用の新しい列を作成したいと考えています(中立(0)を介して強い同意(3)から強く反対(-3))。そう

​​

のように私は、既存のデータフレームに追加することができ、既存のQ6列のテキスト応答と一致するN6と呼ばれる新しい変数を生成し、以下のコードで、これまで得ることができましたcbindを使用します。私の質問は、応答ごとに以下のコードを実行しなくても(つまり、q6からq7、q8から、など)、データフレーム全体で90個の質問を自動化する方法です。

n6 <- ifelse(example$q6=="Daily", 3, 
        ifelse(h16$q6=="",0, 
        ifelse(h16$q6=="Very Often", 2, 
        ifelse(h16$q6=="Often", 1, 
        ifelse(h16$q6=="Neither Rarely nor Often", 0, 
        ifelse(h16$q6=="Rarely", -1, 
        ifelse(h16$q6=="Very Rarely", -2, 
        ifelse(h16$q6=="Never", -3,5 
         )))))))) 

さらに、列q6:q12、q23:30には、上記の例のように、毎日から無応答の範囲の応答があります。カラムq17:q22には、重要でないものから非常に重要なものまでの回答があります。カラムq49:q90には、「強く同意する」から「強く同意しない」の範囲の回答があります。私はn6:n16、n23:30という名前の列に数値を持つ新しいデータフレームを生成する方法で、関連する列(例:q6:12、q23:q30)上で以下のコードを実行するよりスマートな方法を見つけようとしていますコードを90回以下で実行する必要はありません。

これは問題の明確な説明です。

ありがとうございます。

+1

'?factor'を見てください。順序付き引数を使用して、必要に応じて順序付き要素を取得することができます。 – lmo

+1

縮尺が不明です。可能な回答とそれに対応する値のセットは何ですか? –

+0

また、あなたは 'h16'と' example'の検索で異なるオブジェクトを使いました。 –

答えて

1

に動作しますが、基本Rを使用したい場合は、私はむしろ、ルックアップテーブルを構築するという名前のベクトルを使用することをお勧めします複数のネストするよりもifelses s:

n <- c('Daily'=3, 'Very Often'=2, 'Often'=1, 'Never'=-3) 
n[q6] 
#Daily  Never  Often Very Often  Daily 
# 3   -3   1   2   3 
n[q7] 
#Never Never Often Often Daily 
# -3 -3  1  1  3 
+0

ありがとう、Neal。最も役立つ。 –

1

があり速い方法ですが、あなたはすでにその作業のすべてをしたことから、その後、すべての列の上に行くためにsapplyを使用する機能にあなたの現在のプロセスを変革:

:私は q6 [,x]に変化し

お知らせ

numConvert <- function(x) ifelse(example[,x]=="Daily", 3, 
      ifelse(h16[,x]=="",0, 
        ifelse(h16[,x]=="Very Often", 2, 
          ifelse(h16[,x]=="Often", 1, 
            ifelse(h16[,x]=="Neither Rarely nor Often", 0, 
             ifelse(h16[,x]=="Rarely", -1, 
               ifelse(h16[,x]=="Very Rarely", -2, 
                 ifelse(h16[,x]=="Never", -3,5 
                 )))))))) 

この関数は、カラム名を受け入れ、あなたの仕様に基づいて変換します。それを試してみてください:

h16 <- example 
sapply(colnames(example), numConvert) 
#  q6 q7 q17 q23 
# [1,] 3 -3 5 3 
# [2,] -3 -3 5 1 
# [3,] 1 1 5 -3 
# [4,] 2 1 5 -3 
# [5,] 3 3 5 5 

編集

あなたはdplyr >= 0.5.0で利用可能なcase_whenを試しピカピカの新しい機能を使用する場合:

library(dplyr) 
factorise <- function(x) { 
    case_when(x %in% c("Daily", "Very Important") ~ 3, 
      x %in% c("Very Often", "Important") ~ 2, 
      x %in% c("Often") ~ 1, 
      x %in% c("Neutral") ~ 0, 
      x %in% c("Never", "Not Important") ~ -3) 
} 

sapply(example, factorise) 
#  q6 q7 q17 q23 
# [1,] 3 -3 2 3 
# [2,] -3 -3 2 1 
# [3,] 1 1 3 -3 
# [4,] 2 1 0 -3 
# [5,] 3 3 -3 0 
+0

ピエールに感謝します - それは素晴らしい解決策です! –

3

plyrパッケージはrevalueと呼ばれる機能があります。 Replace specified values with new values, in a factor or character vector.こちらが役に立つかもしれません...

require(plyr) 
example2 <- revalue(example, c("Daily"= "3", "Never"= "-3", "Often"= "1", 
      "Very Often"= "2", "Important" = "3", "Very Important"= "3", 
       "Neutral"= "0", "Not Important"= "-3")) 

    q6 q7 q17 q23 
[1,] "3" "-3" "2" "3" 
[2,] "-3" "-3" "2" "1" 
[3,] "1" "1" "3" "-3" 
[4,] "2" "1" "0" "-3" 
[5,] "3" "3" "-3" "0" 

データ

q6 <- c("Daily", "Never", "Often", "Very Often", "Daily") 
q7 <- c("Never", "Never", "Often", "Often", "Daily") 
q23 <- c("Daily", "Often", "Never", "Never", "Neutral") 
q17 <- c("Important", "Important", "Very Important", "Neutral", "Not Important") 
example <- cbind(q6, q7, q17, q23) 

Alterantively、mapvalues

mapvalues(example, from = c("Daily", "Never", "Often", "Very Often", 
      ,"Important", "Very Important", "Neutral", "Not Important"), 
      to = c(3,2,0,-3,2,3,0,-3)) 
+0

ありがとうございます - それがどのように機能するかは、すべての可能な変数(Strongly Agreeなど)をそのオプションのリストに追加するとわかります。 –

関連する問題