【问题标题】:How to convert comma-separated multiple responses into dummy coded columns in R如何将逗号分隔的多个响应转换为 R 中的虚拟编码列
【发布时间】:2021-07-16 06:52:39
【问题描述】:

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

回复列表如下所示:

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 附加到以讲座、教程、作业、演示文稿作为标题的新数据框?

【问题讨论】:

  • 你的数据是这样的吗,竖条和所有东西都在一行上?
  • 嗨,不,我很抱歉。我是堆栈交换的新手,我认为它看起来像一个合适的数据框,但最终看起来像那样。现在正在修复它。应该会做完
  • 尝试在 .csv 中拍摄您的预期结果,然后将其作为 DF 拉入并打印头部并使用 R 中的输出更新您的帖子。这将有助于更好地可视化它:)
  • @BuffsGrad16 感谢您的意见!我在看到您的评论之前已修复它,但这也会有很大帮助:)
  • @AkselA 现在已修复,对此感到抱歉

标签: r dummy-variable surveymonkey


【解决方案1】:

首先将Response 列从因子转换为字符类。然后该列的每个元素都以逗号分隔。我不知道所有可能的响应是什么,所以我使用了所有存在的响应。接下来拆分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.dummy), 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

【讨论】:

  • 感谢您的时间和精力,我真的很感激。这也很有帮助,我也将用我的代码来尝试一下。非常感谢
  • 整洁!要避免do.call(rbind(.)),请尝试sapplywith(Data, data.frame(Student_ID, t(sapply(resp.split, function(x) table(factor(x, levels=lev))))))
【解决方案2】:

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

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

然后我添加了以下行:

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

它对我有用。

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多