(以下の「重要」の注記を参照してください-質問は同様の投稿への回答では解決されません。重複ではありません)
文字列(現在は因子として)から数値(1から5)に再コード化する必要がある同じ2つのリッカート尺度を含む大量のベクトルを含むデータフレームがたくさんあります。スケールは次のとおりです。
Likert scale A:
---------------
Terrible = 1
Below Average = 2
Average = 3
Above Average = 4
Excellent = 5
Likert Scale B:
---------------
Strongly disagree = 1
Somewhat disagree = 2
Meh = 3
Somewhat agree = 4
Strongly agree = 5
例として、HAVE1
これは、これらのリッカートパターンを持つ多くのデータセット(それぞれが異なる数のベクトルと異なるベクトル名を持つ)の1つです。
Apples Oranges Bananas ServiceGood ShortTime
Excellent Terrible Average Somewhat agree Somewhat agree
Excellent Above Average Strongly agree Somewhat agree
Above Average Terrible Below Average Somewhat disagree
Excellent Average Below Average Meh Strongly disagree
Below Average Terrible Above Average Somewhat agree Meh
… … … … …
文字列を、上記のリッカート尺度コードに相当する数値に置き換える必要があります。たとえば、の最初の5つの観測値は次のWANT1
ようになります。
Apples Oranges Bananas ServiceGood ShortTime
5 1 3 4 4
5 NA 4 5 4
4 1 2 NA 2
5 3 2 3 5
2 1 4 4 3
… … … … …
すべてのHAVE
データフレームで名前と位置が異なるため、ベクター名を呼び出す必要のない、これらの値を変更する効率的な方法を探しています。何かご意見は?
重要:この問題は、「辞書スタイルで複数のアイテムを置き換える」という質問で提供されている例では解決されません。すべての回答は、ある種のエラーをスローするか、ほとんどの変数の値をNAで埋める/間違った値を置き換えます。
たとえば、次のコード...
map = setNames(c("Excellent", "Above Average", "Below Average", "Average", "Terrible"),
c("5", "4", "2", "3", "1"))
HAVE1[] <- map[unlist(HAVE1)]
「Terrible」にコード化されている空のセルを除いて、ファイル内のすべての値をNAに設定します。「辞書」の回答で機能する他の質問からの唯一の解決策は、質問自体で質問者によって提案された解決策です。質問者が避けたかったのは、まさにこのアプローチです。
dplyr :: mutate_allを使用する簡単な方法は次のとおりです。str_replace
空の文字列がある場所に欠落している値を挿入recode
し、テキストレベルを目的の数値レベルにすばやく交換することができます。これには、各データフレームの列の名前を知る必要はまったくありません。これは、認識されないオプションをに設定することNA
で処理されることに注意してください。これにより、データにスペルミスがあることも警告されます。またmutate_at
、この方法で再コーディングしたくない列が各データフレームにあるかどうかを調べることもできます。
複数のデータフレームに適用する必要があるという事実に対処するために、この関数を手動で適用するには多すぎる場合は、それらをリストの要素として保存し、次にmap
リスト全体に保存します。
library(tidyverse)
df <- read_table(
"Apples Oranges Bananas ServiceGood ShortTime
Excellent Terrible Average Somewhat agree Somewhat agree
Excellent Above Average Strongly agree Somewhat agree
Above Average Terrible Below Average Somewhat disagree
Excellent Average Below Average Meh Strongly disagree
Below Average Terrible Above Average Somewhat agree Meh"
)
df %>%
mutate_all(~ str_replace(., "^$", NA_character_)) %>%
mutate_all(
.funs = ~ as.integer(recode(
.x = .,
"Terrible" = 1,
"Below Average" = 2,
"Average" = 3,
"Above Average" = 4,
"Excellent" = 5,
"Strongly disagree" = 1,
"Somewhat disagree" = 2,
"Meh" = 3,
"Somewhat agree" = 4,
"Strongly agree" = 5
))
)
#> # A tibble: 5 x 5
#> Apples Oranges Bananas ServiceGood ShortTime
#> <int> <int> <int> <int> <int>
#> 1 5 1 3 4 4
#> 2 5 NA 4 5 4
#> 3 4 1 2 NA 2
#> 4 5 3 2 3 1
#> 5 2 1 4 4 3
reprexパッケージ(v0.2.0)によって2018-05-29に作成されました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加