изменить все строки в кадре данных на одно из нескольких различных значений r (НЕ дубликат) - PullRequest
0 голосов
/ 29 мая 2018

(см. Примечание " ВАЖНО " ниже - вопрос не решается ответами на аналогичный пост; это не дубликат)

У меня есть кучакадров данных с тонной векторов, содержащих те же две шкалы Ликерта, которые мне нужно перекодировать из строк (в настоящее время в виде факторов) в числовые значения (от 1 до 5).Вот шкалы:

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, один из множества наборов данных (каждый из которых имеет различное количество векторов и разных имен векторов) с этими шаблонами likert:

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)]

Устанавливает каждое значениев моем файле к NA кроме пустых ячеек, которые он кодирует как "Грозный".Единственное решение из другого вопроса, которое работает в ответе «словарей», - это решение, предложенное самим вопросом в вопросе - именно этого подхода он хотел избежать.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вот быстрый способ использования 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

Создано в 2018-05-29 пакетом Представить (v0.2.0).

0 голосов
/ 29 мая 2018

В настоящее время я использую набор вызовов lapply (), которые используют gsub () для поиска совпадений в каждой строке, а затем заменяют это совпадение числовым значением шкалы Ликерта.Например:

WANT1 <- data.frame(lapply(HAVE1, function(a){gsub("Excellent",     5, a)}))
WANT1 <- data.frame(lapply(WANT1, function(b){gsub("Above Average", 4, b)}))
WANT1 <- data.frame(lapply(WANT1, function(d){gsub("Below Average", 2, d)}))
WANT1 <- data.frame(lapply(WANT1, function(c){gsub("Average",       3, c)}))
WANT1 <- data.frame(lapply(WANT1, function(e){gsub("Terrible",      1, e)}))

WANT1 <- data.frame(lapply(WANT1, function(a){gsub("Strongly agree",    5, a)}))
WANT1 <- data.frame(lapply(WANT1, function(b){gsub("Somewhat agree",    4, b)}))
WANT1 <- data.frame(lapply(WANT1, function(d){gsub("Somewhat disagree", 2, d)}))
WANT1 <- data.frame(lapply(WANT1, function(c){gsub("Meh",               3, c)}))
WANT1 <- data.frame(lapply(WANT1, function(e){gsub("Strongly Disagree", 1, e)}))

Я вкладываю это в цикл, который проходит по всем HAVE фреймам данных и создает все WANT фреймов данных, но я ищу альтернативные подходы для достижения той же цели.Есть мысли?

...