将字符串拆分为子字符串并在数据框中的每个列中获取指示符?

时间:2017-05-25 15:20:56

标签: r dataframe split

我已经问了一次这个问题。它被标记为"一个精确的复制品"另一个问题,但它不可能,因为对我这个问题的回答并不适用!

我有一个数据框,它是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

有人可以帮我解决这个问题吗?

谢谢!

1 个答案:

答案 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))