R условно заменяет значения в упорядоченном столбце фактора без потери уровней или других атрибутов - PullRequest
0 голосов
/ 07 января 2020

Справочная информация Я работаю с многочисленными большими наборами данных опросов, экспортированными из Qualtrics. В каждом наборе данных есть повторяющиеся вопросы как на испанском sh, так и на английском sh. Подмножество вопросов опроса, на которые ответил участник, определяется по их ответу на вопрос lang в опросе. Ответы на вопросы по испанскому языку sh и английскому sh записаны в разных столбцах на фрейме данных. Имена столбцов для ответов spani sh имеют суффикс _sp. См. Приведенный ниже пример кадра данных

df <- structure(list(id = c(1,2,3,4,5,6,7,8,9,10), lang = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("English / Inglés", "Spanish / Español"), class = c("ordered", "factor")), mob_1 = structure(c(5L, 2L, 6L, 1L, 6L, 8L, 8L, 8L, 8L, 8L), .Label = c("Strongly agree", "Agree", "Somewhat agree", "Neither agree nor disagree", "Somewhat disagree", "Disagree", "Strongly disagree", NA), class = c("ordered", "factor")), mob_2 = structure(c(2L, 3L, 2L, 3L, 5L, 6L, 6L, 6L, 6L, 6L), .Label = c("A lot worse", "A little worse", "The same", "A little better", "A lot better", NA), class = c("ordered", "factor")), mob_1_sp = structure(c(8L, 8L, 8L, 8L, 8L, 5L, 2L, 6L, 1L, 6L), .Label = c("Totalmente de acuerdo", "De acuerdo", "Algo de acuerdo", "Ni de acuerdo ni en desacuerdo", "Algo en desacuerdo", "En desacuerdo", "Totalmente en desacuerdo", NA), class = c("ordered", "factor")), mob_2_sp = structure(c(6L, 6L, 6L, 6L, 6L, 2L, 3L, 2L, 3L, 5L), .Label = c("Mucho peor", "Un poco peor", "Igual", "Un poco mejor", "Mucho mejor", NA), class = c("ordered", "factor"))), row.names = c(NA, -10L), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"))

# A tibble: 10 x 6
      id lang              mob_1             mob_2          mob_1_sp              mob_2_sp    
   <dbl> <ord>             <ord>             <ord>          <ord>                 <ord>       
 1     1 English / Inglés  Somewhat disagree A little worse NA                    NA          
 2     2 English / Inglés  Agree             The same       NA                    NA          
 3     3 English / Inglés  Disagree          A little worse NA                    NA          
 4     4 English / Inglés  Strongly agree    The same       NA                    NA          
 5     5 English / Inglés  Disagree          A lot better   NA                    NA          
 6     6 Spanish / Español NA                NA             Algo en desacuerdo    Un poco peor
 7     7 Spanish / Español NA                NA             De acuerdo            Igual       
 8     8 Spanish / Español NA                NA             En desacuerdo         Un poco peor
 9     9 Spanish / Español NA                NA             Totalmente de acuerdo Igual       
10    10 Spanish / Español NA                NA             En desacuerdo         Mucho mejor 

> str(df)
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    10 obs. of  6 variables:
 $ id      : num  1 2 3 4 5 6 7 8 9 10
 $ lang    : Ord.factor w/ 2 levels "English / Inglés"<..: 1 1 1 1 1 2 2 2 2 2
 $ mob_1   : Ord.factor w/ 8 levels "Strongly agree"<..: 5 2 6 1 6 8 8 8 8 8
 $ mob_2   : Ord.factor w/ 6 levels "A lot worse"<..: 2 3 2 3 5 6 6 6 6 6
 $ mob_1_sp: Ord.factor w/ 8 levels "Totalmente de acuerdo"<..: 8 8 8 8 8 5 2 6 1 6
 $ mob_2_sp: Ord.factor w/ 6 levels "Mucho peor"<"Un poco peor"<..: 6 6 6 6 6 2 3 2 3 5

Моя цель - создать гибкий l oop, который будет замените значения NA в колонках языкового ответа engli sh (mob_1, mob_2) на значения в колонках языкового ответа spani sh (mob_1_sp, mob_2_sp) для испанского языка sh говорящие на языке участники, сохраняя уровни упорядоченного фактора в английском sh столбце языкового ответа.

Я написал следующее l oop, но когда я пытаюсь переназначить уровни упорядоченного коэффициента обратно на языковые столбцы engli sh, отображение не согласовано. Например:

  • строка 1, значение mob_1 не изменилось, но уровень изменился с Somewhat disagree до Somewhat agree
  • строка 6, метки mob_1 и mob_1_sp не совпадают, даже если они имеют одинаковые значения
for (i in colnames(df)) {
  if(grepl("_sp", i)) {
    eng_var <- gsub("_sp","",i) #get name of english variable equivalent
    levels(df[[i]]) <- levels(df[[eng_var]]) #assign english levels to spanish variable 
    df[[eng_var]] = as.ordered(ifelse(df$lang=="Spanish / Español",as.numeric(df[[i]]),df[[eng_var]])) #conditionally replace values of english variable
    levels(df[[eng_var]]) <-  levels(df[[i]]) #re-assign english levels from spanish variable
  }
}

> df
# A tibble: 10 x 6
      id lang              mob_1                      mob_2          mob_1_sp          mob_2_sp      
   <dbl> <ord>             <ord>                      <ord>          <ord>             <ord>         
 1     1 English / Inglés  Somewhat agree             A lot worse    NA                NA            
 2     2 English / Inglés  Agree                      A little worse NA                NA            
 3     3 English / Inglés  Neither agree nor disagree A lot worse    NA                NA            
 4     4 English / Inglés  Strongly agree             A little worse NA                NA            
 5     5 English / Inglés  Neither agree nor disagree The same       NA                NA            
 6     6 Spanish / Español Somewhat agree             A lot worse    Somewhat disagree A little worse
 7     7 Spanish / Español Agree                      A little worse Agree             The same      
 8     8 Spanish / Español Neither agree nor disagree A lot worse    Disagree          A little worse
 9     9 Spanish / Español Strongly agree             A little worse Strongly agree    The same      
10    10 Spanish / Español Neither agree nor disagree The same       Disagree          A lot better  

Мне кажется, проблема с отображением уровней состоит в том, что в ответе на опрос имеется 8 уровней, но только 4 уникальных значения в моем воспроизводимом кадре данных.

Буду признателен за помощь в указании, где я ошибся, и если есть способ просто вставить значения столбца языка spani sh в столбцы языка engli sh, не мешая атрибутам столбца ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...