如何将逗号分隔的多个响应转换为R中的伪编码列

时间:2019-05-22 20:22:31

标签: r dummy-variable surveymonkey

在一项调查中,有一个问题问“课程的哪些方面最有助于您学习概念?请选择所有适用的条件”

以下是响应列表的样子:

Student_ID = c(1,2,3)
Responses = c("lectures,tutorials","tutorials,assignments,lectures", "assignments,presentations,tutorials")
Grades = c(1.1,1.2,1.3)
Data = data.frame(Student_ID,Responses,Grades);Data

Student_ID | Responses                           | Grades
1          | lectures,tutorials                  | 1.1
2          | tutorials,assignments,lectures      | 1.2
3          | assignments,presentations,tutorials | 1.3

现在我想创建一个看起来像这样的数据框

Student_ID | Lectures | Tutorials | Assignments | Presentation | Grades
1          |     1    |     1     |      0      |       0      |  1.3
2          |     1    |     1     |      1      |       0      |  1.4
3          |     0    |     1     |      1      |       1      |  1.3

我设法使用splitstackshape包将逗号分隔的响应分为几列。所以目前我的数据如下:

Student ID | Response 1 | Response 2  | Response 3 | Response 4 | Grades
1          | lectures   | tutorials   |    NA      |     NA     |   1.1
2          | tutorials  | assignments | lectures   |     NA     |   1.2
3          | assignments| presentation| tutorials  |     NA     |   1.3

但是正如我之前所说,我希望我的表看起来像我上面用伪代码表示的方式。我被困在如何进行。也许一个主意是遍历列中的每个观察值,然后将1或0附加到以演讲,教程,作业,演示文稿作为标题的新数据框中?

2 个答案:

答案 0 :(得分:0)

首先,将Response列从factor转换为character class。该列的每个元素然后以逗号分隔。我不知道所有可能的答复是什么,所以我使用了所有存在的答复。接下来,将拆分的Response列制成表格,并指定可能的级别。生成的列表在转换为旧的data.frame之前先转换为矩阵。

Data$Responses <- as.character(Data$Responses)
resp.split <- strsplit(Data$Responses, ",")

lev <- unique(unlist(resp.split))

resp.dummy <- lapply(resp.split, function(x) table(factor(x, levels=lev)))

Data2 <- with(Data, data.frame(Student_ID, do.call(rbind, resp.fac), Grades))
Data2
#   Student_ID lectures tutorials assignments presentations Grades
# 1          1        1         1           0             0    1.1
# 2          2        1         1           1             0    1.2
# 3          3        0         1           1             1    1.3

答案 1 :(得分:0)

我找到了对我问题的答复。我最初是

library(splitstackshape)
Responses = cSplit(Data, "Responses",",")

然后我添加了以下行:

library(qdapTools)
TA <- mtabulate(as.data.frame(t(TA)))

对我有用。