创建cols / var,其命名为先前cols / var中特定响应的函数

时间:2018-12-02 09:45:16

标签: r

长标题将是“ create cols / var 1),它是根据先前cols / var中的特定响应命名的,以及2)包含新值作为数组中先前响应位置的函数(最差缩放)应用程序”)

我正在执行一些最差的定标(maxdiff)分析,我需要将原始响应数据文件中的数据转换为适合BWS分析的数据文件。

我的响应数据文件为dfex,最终结果应为dfbw。 基本上,示例起始数据文件是不言自明的,即存在两个问题q01和q02,受访者指出这些问题的哪些可用替代方案是“最佳”或“最差”(“最有用”和“最不有用”) “,在这里)。

适用于BWS分析的最终数据文件应指出每个问题,在每个问题的四个可能选择中选择哪个。例如,在案例1的问题1中,被访者将第一种选择称为“最有用”,将第三种选择称为“最不有用”。

我目前正在通过一些严重的愚蠢的手动分数转换来做到这一点,但是我确信可以使用更加优雅的解决方案(我在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 :(得分:0)

tidyverse软件包的集合非常棒,一旦您学会了如何格式化数据,并且通常永远不需要a)编写任何类型的循环或b)一旦获得了更多的工作代码更多数据。

首先创建数据帧"tidy"。每个观察值应为一行,因此您需要一列用于问题ID,一列用于替代项以及一列用于回答。这就是gather的作用:它使您的“宽”数据“长”。我们进一步从问题ID中删除了“ q”,因为它不是必需的。

此外,添加一列,为您提供主题ID –基本上是每组问题/替代项中的行号。通过group_bymutate的组合来完成。

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