我已经问了一次这个问题。它被标记为"一个精确的复制品"另一个问题,但它不可能,因为对我这个问题的回答并不适用!
我有一个数据框,它是Google Forms调查问卷调查中的响应数据集。 Google表单已将多个选择,多个答案问题的答案放入一个变量中,因此它看起来像这样:
Q1 Q2 Q3
1 "A, B ,C" S
2 "C, D" T
1 "A, C, E" U
3 "D" V
2 "B, E" Z
实际的A,B,C,D和E值是带有逗号的较长语句,例如
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
Veniam, quis nostrud exercitation ullamco laboris
Google表单已经用逗号报告了它们,但如果需要,我可以手动将这些逗号更改为任何其他字符(因为我知道哪些逗号在语句中,哪些在介于两者之间,所以说)。
我希望我的数据看起来像这样:
Q1 Q2 Q2A Q2B Q2C Q2D Q2E Q3
1 "A, B, C" 1 1 1 0 0 S
2 "C, D" 0 0 1 1 0 T
1 "A, C, E" 1 0 1 0 1 U
3 "D" 0 0 0 1 0 V
2 "B, E" 0 1 0 0 1 Z
在与我的问题完全相同的问题中,但是没有,答案是使用名为" splitstackshape"和一个名为cSplit_e的函数。当我这样做时,我收到一条错误消息:
test21 <- cSplit_e(test2, split.col= "X1a", sep = "!")
Error in seq.default(min(vec), max(vec)) :
'from' cannot be NA, NaN or infinite
In addition: Warning messages:
1: In lapply(listOfValues, as.integer) : NAs introduced by coercion
2: ....
...
n: In lapply(listOfValues, as.integer) : NAs introduced by coercion
有人可以帮我解决这个问题吗?
谢谢!
答案 0 :(得分:3)
我们可以使用mtabulate
qdapTools
执行此操作
library(qdapTools)
d1 <- mtabulate(strsplit(df1$Q2, "\\s*,\\s*"))
names(d1) <- paste0(names(df1)[2], names(d1))
cbind(df1[1:2], d1, df1[3])
# Q1 Q2 Q2A Q2B Q2C Q2D Q2E Q3
#1 1 A, B ,C 1 1 1 0 0 S
#2 2 C, D 0 0 1 1 0 T
#3 1 A, C, E 1 0 1 0 1 U
#4 3 D 0 0 0 1 0 V
#5 2 B, E 0 1 0 0 1 Z
df1 <- structure(list(Q1 = c(1L, 2L, 1L, 3L, 2L), Q2 = c("A, B ,C",
"C, D", "A, C, E", "D", "B, E"), Q3 = c("S", "T", "U", "V", "Z"
)), .Names = c("Q1", "Q2", "Q3"), class = "data.frame", row.names = c(NA,
-5L))