Qualtrics 调查,减少列

Qualtrics survey, reducing columns

我和一些同学为课程司法立法创建了一个质量调查。我们处理了 4 个案例小插图。每个受访者首先回答一些一般性问题,然后他们回答一个案例。他们首先被问及是否应给予赡养费,然后又被问及给多少。只有回答是的人才能看到第二个问题。现在我们将数据导入 R。因为他们只回答了 1 个案例,还有 3 个未解决,所以有很多缺失值。我正在尝试创建一个没有所有未回答问题的数据集?但是,我只能设法得到所有是的答案。另一方面,我设法删除了 NA,但似乎第一个问题不再与第二个问题相关联。 (如果 Q7 的回答是肯定的,下一栏应该是 Q8,但是我看到第一栏说 Q7,第二栏说 Q12 例如。我会添加我写的代码,但我是法学院学生所以我对一切的理解是相当有限。我添加了一个简化的示例。从 1 到 4 的数字代表 4 种不同的情况。

    age <- c("18-30","18-30","31-45", 60)
YesNo1 <- c("Yes", NA,NA,NA)
Height1 <- c(250,NA,NA,NA)
YesNo2 <- c(NA,"NO",NA,NA)
Height2 <- c(NA,NA,NA,NA)
YesNo3 <- c(NA,NA,"Yes", NA)
Height3 <- c(NA,NA,320,NA)
YesNo4 <- c(NA,NA,NA,"yes")
Height4 <- c(NA,NA,NA, 290)

Test <- data.frame(age, YesNo1, Height1, YesNo2, Height2, 
                  YesNo3, Height3, YesNo4,Height4)


#inspect the data
Test


# reduce the columns 

mi <- pivot_longer(Test, c(YesNo1, YesNo2, YesNo3, YesNo4), 
                         names_to = "decision", values_to = "yes/no")

mi1 <- pivot_longer(mi, c(Height1, Height2, Height3, Height4), 
                    names_to = "alimony", values_to = "height")

#drop the NA rows
mi2 <- mi1 %>% drop_na('yes/no')

在理想情况下,我希望有一个数据集包含一般问题,后跟一列包含是或否问题的编号以及包含答案的列。然后是一栏,其中包含应该授予多少赡养费的问题编号和一栏,其中包含答案。 (问题的数字应该始终匹配(7and8,9and10 ...)我希望这很清楚并且有人可以帮助我。我将我的问题翻译成一个简化版本。当一个人在 R 中运行它时,你可以看到是 4 次是,4 次不是。我只想保留 1 个是和 1 个否。但我不能删除带有 NA 的剩余行,因为它也会删除未回答的问题。你知道我该如何解决请问呢?

显然您想使用 tidyr。我不适合 tidyverse,所以我想向您展示一种使用标准 R 和 stack 函数的方法。以您的数据为例

Height1 <- c(250,NA,NA,NA)
YesNo2 <- c(NA,"NO",NA,NA)
Height2 <- c(NA,NA,NA,NA)
YesNo3 <- c(NA,NA,"Yes", NA)
Height3 <- c(NA,NA,320,NA)
YesNo4 <- c(NA,NA,NA,"yes")
Height4 <- c(NA,NA,NA, 290)

Test <- data.frame(age, YesNo1, Height1, YesNo2, Height2, 
                   YesNo3, Height3, YesNo4,Height4)

我们现在可以将 YesNo 列和 Height 列堆叠在一起,调用结果 stacked:

stacked <- data.frame(age = Test$age,
               yesno = stack(Test, select = c("YesNo1", "YesNo2", "YesNo3", "YesNo4")),
               height = stack(Test, select = c("Height1", "Height2", "Height3", "Height4"))
                )

如果你 print(stacked) 你会看到很多 NA。因此,在下一步(也是最后一步)中,我们删除所有在 yesno 列中具有 NA 的列:

stacked <- stacked[!is.na(stacked$yesno.values),]
print(stacked)

结果就是我从你的问题中了解到的目标:

> print(stacked)
     age yesno.values yesno.ind height.values height.ind
1  18-30          Yes    YesNo1           250    Height1
6  18-30           NO    YesNo2            NA    Height2
11 31-45          Yes    YesNo3           320    Height3
16    60          yes    YesNo4           290    Height4

抱歉,这不是一个整洁的答案。至少,No答案被保存在数据中。

这是你应用于我的更大数据集的解决方案@bernhard

Test <- read.csv2("Data2.csv", header = TRUE, sep = ",")
#inspect the data
Test
#select data
Test1 <- Test[,11:24]
#NA invullen
Test2 <- Test1
Test2[Test2 == ""] <- NA

stacked1 <- data.frame(Q1 = Test2$Q1, Q2 = Test2$Q2, Q3 = Test2$Q3,
                       Q4 = Test2$Q4, Q5 = Test2$Q5, Q6 = Test2$Q6,
                      yesno = stack(Test2, select = c("Q7", "Q9", "Q11", "Q13")),
                      height = stack(Test2, select = c("Q8", "Q10", "Q12", "Q14")))
stacked1[stacked1 == ""] <- NA
stacked1 <- stacked1[!is.na(stacked$yesno.values),]
print(stacked2)

正如我在评论中提到的那样,NA 不会消失,但它们也不会给出错误