создать cols / var, названный как функция определенных ответов в предыдущих cols / var - PullRequest
0 голосов
/ 02 декабря 2018

Длинный заголовок был бы "create cols / var 1), названный как функция определенных ответов в предыдущих cols / var и 2), которые содержат новые значения как функцию предыдущих позиций ответов в массиве (наилучшее-худшее масштабирование)application) "

Я выполняю некоторые анализы с наилучшим наихудшим масштабированием (maxdiff), и мне нужно преобразовать данные из файла необработанных ответов в файл данных, подходящий для анализов BWS.

Файл данных моих ответов dfex, а конечный результат должен быть dfbw.По сути, пример исходного файла данных не требует пояснений, то есть есть два вопроса q01 и q02, и респонденты указывают, какие из доступных альтернатив этим вопросам являются «лучшими» или «худшими» («наиболее полезными» и «наименее полезными»).", здесь).

В окончательном файле данных, подходящем для анализа BWS, должно указываться для каждого вопроса, какая альтернатива из четырех возможных для каждого вопроса была выбрана.Например, в случае 1, вопрос 1, респондент указал 1-ую альтернативу как «наиболее полезную» и 3-ю альтернативу как «наименее полезную».

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

Не могли бы вы, пожалуйста, указать мне правильное направление (то есть, как автоматизировать этот процесс и сделать его более плавным), и, если возможно, укажите, пожалуйста, причины, по которым вы выбрали использование определенного пакета или определенного подхода по сравнению сдругая (например, пользовательская функция по сравнению с комбинацией функций в пакете / с)?

    # This is my starting data frame
    dfex <- data.frame(stringsAsFactors=FALSE,
          q01_01 = c("most useful", "least useful", "least useful", NA),
          q01_02 = c(NA, "most useful", "most useful", "most useful"),
          q01_03 = c("least useful", NA, NA, "least useful"),
          q01_04 = c(NA, NA, NA, NA),
          q02_01 = c("least useful", "least useful", NA, "least useful"),
          q02_02 = c(NA, NA, NA, NA),
          q02_03 = c(NA, "most useful", "most useful", "most useful"),
          q02_04 = c("most useful", NA, "least useful", NA))

     # which now I'm processing manually
    dfex <- dfex %>% 
      mutate(b01_01 = case_when(q01_01 == "most useful" ~ 1)) %>% 
      mutate(b01_02 = case_when(q01_02 == "most useful" ~ 2)) %>% 
      mutate(b01_03 = case_when(q01_03 == "most useful" ~ 3)) %>% 
      mutate(b01_04 = case_when(q01_04 == "most useful" ~ 4)) %>% 
      mutate(b02_01 = case_when(q02_01 == "most useful" ~ 1)) %>% 
      mutate(b02_02 = case_when(q02_02 == "most useful" ~ 2)) %>% 
      mutate(b02_03 = case_when(q02_03 == "most useful" ~ 3)) %>% 
      mutate(b02_04 = case_when(q02_04 == "most useful" ~ 4)) %>%
      mutate(w01_01 = case_when(q01_01 == "least useful" ~ 1)) %>% 
      mutate(w01_02 = case_when(q01_02 == "least useful" ~ 2)) %>% 
      mutate(w01_03 = case_when(q01_03 == "least useful" ~ 3)) %>% 
      mutate(w01_04 = case_when(q01_04 == "least useful" ~ 4)) %>% 
      mutate(w02_01 = case_when(q02_01 == "least useful" ~ 1)) %>% 
      mutate(w02_02 = case_when(q02_02 == "least useful" ~ 2)) %>% 
      mutate(w02_03 = case_when(q02_03 == "least useful" ~ 3)) %>% 
      mutate(w02_04 = case_when(q02_04 == "least useful" ~ 4))

    # create (manually) cols 
    dfex %>% 
      select(c(b01_01:b01_04)) %>% 
      rowSums(., na.rm = T) -> dfex$B1
    dfex %>% 
      select(c(b02_01:b02_04)) %>% 
      rowSums(., na.rm = T) -> dfex$B2
    dfex %>% 
      select(c(w01_01:w01_04)) %>% 
      rowSums(., na.rm = T) -> dfex$W1
    dfex %>% 
      select(c(w02_01:w02_04)) %>% 
      rowSums(., na.rm = T) -> dfex$W2

    # getting the desired BW datafile after selecting only cols of interest
    dfbw <- dfex %>% select(B1:W2)

PS: Из-за всего внимания, уделяемого tidyverse, я подумал, что эта коллекция пакетов может подойти для моегопроблема (?).

1 Ответ

0 голосов
/ 02 декабря 2018

Коллекция пакетов tidyverse великолепна, как только вы научились форматировать ваши данные, и что обычно нет необходимости: а) записывать циклы любого типа или б) выполнять больше работы по кодированию, как только вы получаете больше данных.

Начните с создания фрейма данных "аккуратно" .Каждое наблюдение должно состоять из одной строки, поэтому вам нужен столбец для идентификатора вопроса, столбец для альтернативы и один для ответа.Вот что делает gather: это делает ваши "широкие" данные "длинными".Далее мы убираем «q» из идентификатора вопроса, так как он не нужен.

Кроме того, добавьте столбец, в котором указан идентификатор субъекта - это, в основном, номер строки в каждой группе вопросов / альтернатив.Это делается с помощью комбинации group_by и mutate.

library(tidyverse)

dfex.tidy = dfex %>% 
  gather(question, answer, starts_with("q")) %>% 
  separate(question, into=c("question", "alternative")) %>% 
  mutate(question = str_replace_all(question, "q", "")) %>% 
  group_by(question, alternative) %>% 
  mutate(subject = row_number())

Это дает вам:

# A tibble: 32 x 4
# Groups:   question, alternative [8]
   question alternative answer       subject
   <chr>    <chr>       <chr>          <int>
 1 01       01          most useful        1
 2 01       01          least useful       2
 3 01       01          least useful       3
 4 01       01          NA                 4
 5 01       02          NA                 1
 6 01       02          most useful        2
 7 01       02          most useful        3
 8 01       02          most useful        4
 9 01       03          least useful       1
10 01       03          NA                 2 

… и так далее.Как видите, каждый ответ - это строка.(Фактически, неответы также являются частью этого фрейма данных, но удалять эти строки не обязательно.)

Теперь мы отфильтровываем все пропущенные ответы и перекодируем их из «наиболее / наименее полезных».«1 и 2, чтобы мы знали их внутренний порядок.

Затем мы группируем по предмету и вопросу.Выбранная «наиболее полезная» альтернатива будет первой альтернативой при упорядочении результатов по значению ответа (1 или 2).И наоборот, «наименее полезная» альтернатива будет первой альтернативой при упорядочении результатов по нисходящему значению ответа:

dfex.results = dfex.tidy %>% 
  filter(!is.na(answer)) %>% 
  # recode answer to 1 or 2
  mutate(answer = ifelse(answer == "most useful", 1, 2)) %>% 
  group_by(subject, question) %>% 
  summarize(
    best = first(alternative, order_by = answer),
    worst = first(alternative, order_by = desc(answer))
  )

Это дает вам:

  subject question best  worst
    <int> <chr>    <chr> <chr>
1       1 01       01    03   
2       1 02       04    01   
3       2 01       02    01   
4       2 02       03    01   
5       3 01       02    01   
6       3 02       03    04   
7       4 01       02    03   
8       4 02       03    01

Эти данные должны легко работать и масштабироваться для любого количества вопросов, альтернатив и ответов, если ваши входные данные остаются в том же формате.Тем не менее, вы должны действительно попытаться собрать свои входные данные уже аккуратно, если это возможно.

Вы можете дополнительно привести в порядок данные, чтобы получить лучшую или худшую альтернативу для данного предмета и вопроса:

dfex.results %>% 
  gather(type, alternative, c(best, worst))

# A tibble: 16 x 4
# Groups:   subject [4]
   subject question type  alternative
     <int> <chr>    <chr> <chr>      
 1       1 01       best  01         
 2       1 02       best  04         
 3       2 01       best  02         
 4       2 02       best  03  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...