如何从宽到长重塑联合数据?

问题描述

用户

我收到了一项联合调查实验的数据。我想要做的是从宽格式到长格式重塑。不过,这似乎有点复杂。我很确定可以使用 cj_tidy(包 cregg),但我自己无法解决

在调查中,受访者被要求比较两个在 7 个简介效率 Opennes 包容性 em> 领导者 增益 & 系统)。总共向受访者展示了四项比较。所以 2 个组织和 4 个比较 (4x2)。他们必须在所呈现的组织中选择一个,并在选择一个后分别对其进行评分。

目前,配置文件变量的结构如下:org1_Efficiency_conj_1、org1_Opennes_conj1 ..etc。第一部分“org”表示它是第一个组织还是第二个组织。最后一部分“conj”,表示联合/比较的顺序,其中“conj4”是最后的比较。 CHOICE 变量也遵循联合的顺序——例如,“CHOICE_conj1”、“CHOICE_conj2”,其中 =1 表示受访者选择了“org1”。如果=2,则选择org2。 rating> 变量表示每个组织的 0 到 10 之间的值:rating_conj1_org1; rating_conj1_org2 等。

当前的宽格式数据不适合联合分析 - 我需要为每个受访者创建 8 个观察值 (4x2=8),其中变量 CHOICE 将指示哪些组织被选中(如果是,则 =1;如果否,则 =0)。以类似的方式,变量 rating 应表示受访者对两个组织的评分(0 到 10)。

这是我希望数据的样子:

enter image description here

请注意,图片中还有协变量,例如 Q1 和 Q2,它们不是实验的一部分,应在每次观察时保持不变。

下面我分享了我的真实数据中的 50 个观察结果。

    > dput(cjdata_wide) structure(list(ID = 1:50,org1_Effeciency_conj_1 =
    > c(3L,2L,1L,3L,> 2L,> 3L,1L ),> org1_Oppenes_conj_1 = c(3L,> 1L,1L),org1_Inclusion_conj_1 = c(2L,2L),org1_leader_conj_1 =
    > c(5L,6L,4L,5L,> 5L,3L),> org1_Gain_conj_1 = c(4L,8L,> 8L,7L,> 6L,6L),org1_System_conj_1 = c(5L,org2_Effeciency_conj_1 = c(2L,> org2_Oppenes_conj_1 = c(1L,org2_Inclusion_conj_1 = c(1L,org2_leader_conj_1 =
    > c(4L,> org2_Gain_conj_1 = c(5L,> 7L,> 4L,7L),org2_System_conj_1 = c(3L,org1_Effeciency_conj_2 = c(2L,> org1_Oppenes_conj_2 = c(1L,org1_Inclusion_conj_2 = c(2L,org1_leader_conj_2 =
    > c(3L,4L),> org1_Gain_conj_2 = c(3L,org1_System_conj_2 = c(5L,org2_Effeciency_conj_2 = c(3L,> org2_Oppenes_conj_2 = c(2L,org2_Inclusion_conj_2 = c(1L,org2_leader_conj_2 =
    > c(6L,> org2_Gain_conj_2 = c(8L,org2_System_conj_2 = c(1L,org1_Effeciency_conj_3 = c(1L,> org1_Oppenes_conj_3 = c(2L,org1_Inclusion_conj_3 = c(1L,org1_leader_conj_3 =
    > c(3L,5L),> org1_Gain_conj_3 = c(2L,org1_System_conj_3 = c(5L,org2_Effeciency_conj_3 = c(2L,> org2_Oppenes_conj_3 = c(1L,org2_Inclusion_conj_3 = c(2L,org2_leader_conj_3 =
    > c(1L,> org2_Gain_conj_3 = c(1L,org2_System_conj_3 = c(4L,org1_Effeciency_conj_4 = c(1L,> org1_Oppenes_conj_4 = c(2L,org1_Inclusion_conj_4 = c(2L,org1_leader_conj_4 =
    > c(4L,> org1_Gain_conj_4 = c(3L,org1_System_conj_4 = c(5L,org2_Effeciency_conj_4 = c(3L,> org2_Oppenes_conj_4 = c(1L,org2_Inclusion_conj_4 = c(1L,org2_leader_conj_4 =
    > c(1L,> org2_Gain_conj_4 = c(5L,org2_System_conj_4 = c(2L,CHOICE_conj1 = c(2L,rating_conj1_org1 =
    > c(1L,0L,10L,9L),> rating_conj1_org2 = c(7L,> 0L,9L,CHOICE_conj2 = c(1L,rating_conj2_org1 = c(5L,rating_conj2_org2 =
    > c(0L,> CHOICE_conj3 = c(2L,rating_conj3_org1 = c(4L,rating_conj3_org2 = c(7L,8L),CHOICE_conj4 =
    > c(2L,> rating_conj4_org1 = c(4L,rating_conj4_org2 = c(6L,> 10L,Q7 = c(0L,977L,Q8 = c(1L,Q9 = c(4L,Q10 =
    > c(8L,> 977L,10L),Q11 = c(10L,> 9L,Q12 = c(0L,966L,0L),Q13 = c(2L,Q14 =
    > c(3L,Q1 =
    > c(2L,> Q2 = c(1L,gender = c(1L,profile_age = c(5L,educ = c(6L,3L)),class = "data.frame",row.names =
    > c(NA,> -50L))

到目前为止我所做的是:

library(cregg) 
str(long <- cj_tidy(cjdata_wide,profile_variables = c("All the profile variables"),task_variables = c("CHOICE AND rating VARIABLES HERE"),id = ~ id))
stopifnot(nrow(long) == nrow(data)*4*2

但我不断收到错误消息。我试图遵循 cregg 包给出的示例 - 但没有成功。任何帮助深表感谢!我对所有可能的方式持开放态度,例如通过 cregg 包或 tidyr

解决方法

您的数据不是标准格式,这让这成为一个难题。这是使用 tidyr 包的解决方案。

解决方案包括 3 个部分,处理配置文件、评级和最终评级选择。

配置文件部分的关键是旋转较长并将配置文件名称分解为组成部分,然后为列标题旋转更宽。

评级和二元选择涉及旋转更长的时间然后对齐行。

library(tidyr)
library(dplyr)

#Get the  categories part correct
answer <-cjdata_wide %>% pivot_longer(cols=starts_with("org"),names_to=c("org","Cat","conj","order"),values_to= "values",names_sep="_") %>% select(-c("conj"))
answer <-answer %>% select(!starts_with("RATING") & !starts_with("CHOICE"))
answer <-pivot_wider(answer,names_from = "Cat",values_from = "values") 

#get the ratings column corretn
rating <-cjdata_wide %>% select(starts_with("RATING") )
rating <- rating%>% pivot_longer(cols=everything(),names_to=c("Rating",values_to= "Choice_Rating",names_sep="_") %>% select(-c("conj"))

answer$Choice_Rating <- rating$Choice_Rating

#Get the choice correct
choice <-cjdata_wide %>% select(starts_with("CHOICE") )
choiceRate <- choice%>% pivot_longer(cols=everything(),names_to=c("Choice","conj"),names_sep="_") %>% select(-c("conj"))

answer$Choice_binary <-ifelse(substr(answer$org,4,4) == rep(choiceRate$Choice_Rating,each=2),1,0)

    answer

可以简化上述内容。祝你好运。

每条评论更新
最终数据框具有对应于 org 1 或 2 的行对。我复制了选择,以便 Choice_Rating 列与组织(“org”列)的长度相同。然后我比较了 Choice_Rating & Organization 并根据匹配将最终值设置为 0 或 1。
对于评论中的问题,一个简单的方法是使用 as.integer() 函数将因子列转换为整数,然后第一个因子变为 1,第二个变为 2 等(可能需要重新调整以获得正确的顺序).
另一种选择是创建一个新的“组织”列,其中正确列出了您的因素名称。
希望这能提供足够的指导。