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 不会消失,但它们也不会给出错误
我和一些同学为课程司法立法创建了一个质量调查。我们处理了 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 不会消失,但它们也不会给出错误