长标题将是“ 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
的关注,我认为此软件包集合可能适合我的问题(?)。
答案 0 :(得分:0)
tidyverse
软件包的集合非常棒,一旦您学会了如何格式化数据,并且通常永远不需要a)编写任何类型的循环或b)一旦获得了更多的工作代码更多数据。
首先创建数据帧"tidy"。每个观察值应为一行,因此您需要一列用于问题ID,一列用于替代项以及一列用于回答。这就是gather
的作用:它使您的“宽”数据“长”。我们进一步从问题ID中删除了“ q”,因为它不是必需的。
此外,添加一列,为您提供主题ID –基本上是每组问题/替代项中的行号。通过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