Замена «Другое - Впишите» на текст в данных опроса с помощью Tidyverse - PullRequest
0 голосов
/ 14 марта 2020

У меня большой набор данных ответов на опросы, которые у меня возникают проблемы при очистке.

В начале опроса респонденты выбирают группу (в данном примере цвет), и им условно показывается тот же вопрос (в этом примере «ранжируйте три своих любимых фрукта из этого списка или напишите в другом фрукте»), но в зависимости от выбранного цвета им были показаны разные списки фруктов на выбор.

Изначально данные выглядели примерно так. Существует столбец для каждой комбинации выбора цвета и ответа, причем значением является ранг, который они дали этому варианту ответа, и столбец «другой» с текстовым ответом, в который они записали, если они оценили «другой» как один из своих вариантов:

# A tibble: 11 x 8
   responseid color   red_q1_a  red_q1_b  red_q1_c  red_q1_other  red_q1_other_answer blue_q1_a
        <dbl> <chr>     <dbl>    <dbl>    <dbl>        <dbl>    <chr>                   <dbl>
 1         34 red           2        1       NA            3    "Pomegranates"             NA
 2         35 blue         NA       NA       NA           NA    NA                          1
 3         36 green        NA       NA       NA           NA    NA                         NA
 4         37 purple       NA       NA       NA           NA    NA                         NA
 5         38 red           1       NA        3            2    "Watermelon"               NA
 6         39 green        NA       NA       NA           NA    NA                         NA
 7         40 purple       NA       NA       NA           NA    NA                         NA
 8         41 blue         NA       NA       NA           NA    NA                         NA
 9         42 blue         NA       NA       NA           NA    NA                          2
10         43 green        NA       NA       NA           NA    NA                         NA
11         44 red           1        3        2           NA    NA                         NA   

Мне удалось очистить данные до такой степени, что они выглядят примерно так, по первому вопросу:

# A tibble: 11 x 6
   responseid color  q1_first_choice   q1_second_choice   q1_third_choice   q1_other_answer
        <dbl> <chr>  <chr>             <chr>              <chr>             <chr>          
 1         34 red    q1_red_b           q1_red_a            q1_red_other       "Pomegranate"    
 2         35 blue   q1_blue_a          q1_blue_c           q1_blue_b          NA             
 3         36 green  q1_green_other     q1_green_b          q1_green_a         "Tangerine"      
 4         37 purple q1_purple_b        q1_purple_a         q1_purple_c        NA             
 5         38 red    q1_red_a           q1_red_other        q1_red_c           "Watermelon"     
 6         39 green  q1_green_a         q1_green_c          q1_green_b         NA             
 7         40 purple q1_purple_b        q1_purple_a         q1_purple_c        NA             
 8         41 blue   q1_blue_c          q1_blue_a           q1_blue_other      "Blueberries"    
 9         42 blue   q1_blue_a          q1_blue_c           q1_blue_b          NA             
10         43 green  q1_green_c         q1_green_b          q1_green_a         NA             
11         44 red    q1_red_b           q1_red_a            q1_red_c           NA       

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

   responseid color q1_first_choice    q1_second_choice    q1_third_choice 
          34 red    q1_red_b           q1_red_a            "Pomegranate"    
          35 blue   q1_blue_c          q1_blue_a           q1_blue_b          
          36 green  "Tangerine"        q1_green_b          q1_green_a         
          37 purple q1_purple_b        q1_purple_a         q1_purple_c        
          38 red    q1_red_a           "Watermelon"        q1_red_c           
          39 green  q1_green_a         q1_green_c          q1_green_b                      
          40 purple q1_purple_b        q1_purple_a         q1_purple_c                     
          41 blue   q1_blue_c          q1_blue_b           "Blueberries"    
          42 blue   q1_blue_a          q1_blue_c           q1_blue_b                       
          43 green  q1_green_c         q1_green_b          q1_green_a                      
          44 red    q1_red_b           q1_red_a            q1_red_c                  

У меня возникли проблемы при попытке использовать эффективный ifelse или case_when для этого - мне нужна функция, которая говорит, что для всех значений в столбцах q1_first_choice: q1_third_choice, если они содержат строку «other», замените их значением в столбце q1_other_answer в этой строке.

Затем, наконец, я хочу заменить коды ответов ("q1_blue_ c", et c) их фактическими значениями. Я думаю, что это может быть достаточно просто с помощью функции case_when, но есть ли эффективный способ применить это преобразование к нескольким строкам для очень длинного списка дел? У меня есть кодовая книга для опроса, связывающая все имена переменных с их фактическим выбором ответа (ie, q1_red_a - «Apple», q1_red_b - «Банан», et c, через сотни вариантов выбора). Есть ли хороший способ сохранить этот список как некоторый объект в R и настроить оператор ifelse / case_when для ссылки на него, вместо того, чтобы выводить весь список внутри функции?

1 Ответ

1 голос
/ 14 марта 2020

Можете ли вы задать свой второй вопрос в качестве отдельного вопроса? Лучше держать каждый вопрос отдельно, чтобы будущим читателям было легче найти решения для каждой конкретной проблемы c.

Для первой проблемы идея заключается в использовании if_else(), где, если слово «Другое» включено (используется str_detect()), замените на q1_other_answer, иначе оставьте как есть. Затем примените это к нужным переменным, используя mutate_at().

library(tidyverse)

mydf <- tribble(
~responseid, ~color,  ~q1_first_choice,   ~q1_second_choice,   ~q1_third_choice,   ~q1_other_answer,
34, "red   " , "q1_red_b     "  ,    "q1_red_a    "    ,    "q1_red_other "   ,   "Pomegranate"    ,
35, "blue  " , "q1_blue_a    "  ,    "q1_blue_c   "    ,    "q1_blue_b    "   ,   NA             ,
36, "green " , "q1_green_other" ,    "q1_green_b  "    ,    "q1_green_a   "   ,   "Tangerine"      ,
37, "purple" , "q1_purple_b  "  ,    "q1_purple_a "    ,    "q1_purple_c  "   ,   NA             ,
38, "red   " , "q1_red_a     "  ,    "q1_red_other"    ,    "q1_red_c     "   ,   "Watermelon"     ,
39, "green " , "q1_green_a   "  ,    "q1_green_c  "    ,    "q1_green_b   "   ,   NA             ,
40, "purple" , "q1_purple_b  "  ,    "q1_purple_a "    ,    "q1_purple_c  "   ,   NA             ,
41, "blue  " , "q1_blue_c    "  ,    "q1_blue_a   "    ,    "q1_blue_other"   ,   "Blueberries"    ,
42, "blue  " , "q1_blue_a    "  ,    "q1_blue_c   "    ,    "q1_blue_b    "   ,   NA             ,
43, "green " , "q1_green_c   "  ,    "q1_green_b  "    ,    "q1_green_a   "   ,   NA             ,
44, "red   " , "q1_red_b     "  ,    "q1_red_a    "    ,    "q1_red_c     "   ,   NA       
) %>% 
  mutate_if(is.character, str_trim)

mutate_at(mydf, vars(ends_with("choice")), ~ if_else(str_detect(., "other"), q1_other_answer, .))

# A tibble: 11 x 6
   responseid color  q1_first_choice q1_second_choice q1_third_choice q1_other_answer
        <dbl> <chr>  <chr>           <chr>            <chr>           <chr>          
 1         34 red    q1_red_b        q1_red_a         Pomegranate     Pomegranate    
 2         35 blue   q1_blue_a       q1_blue_c        q1_blue_b       NA             
 3         36 green  Tangerine       q1_green_b       q1_green_a      Tangerine      
 4         37 purple q1_purple_b     q1_purple_a      q1_purple_c     NA             
 5         38 red    q1_red_a        Watermelon       q1_red_c        Watermelon     
 6         39 green  q1_green_a      q1_green_c       q1_green_b      NA             
 7         40 purple q1_purple_b     q1_purple_a      q1_purple_c     NA             
 8         41 blue   q1_blue_c       q1_blue_a        Blueberries     Blueberries    
 9         42 blue   q1_blue_a       q1_blue_c        q1_blue_b       NA             
10         43 green  q1_green_c      q1_green_b       q1_green_a      NA             
11         44 red    q1_red_b        q1_red_a         q1_red_c        NA             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...