r - 根据字符串模式匹配拆分数据框列
问题描述
问题 - 数据整理:
我想微调多项选择题考试的注释,每个问题有 5 个项目 - A、B、C、D、E。我想在每个可能的项目上使用系数。为此,我需要进行一些数据整理:
输入:
library(tibble)
(
df <- tribble(
~id, ~Q1, ~Q2, ~Q3,
#|----|------|------|------|
1, "CDE", "A", "AD",
2, "CDE", "AB", "AD",
3, "DE", "BC", "AD")
)
预期输出:
ID | Q1_A | Q1_B | Q1_C | Q1_D | Q1_E | Q2_A | Q2_B | Q2_C | Q2_D | Q2_E | Q3_A | Q3_B | Q3_C | Q3_D | Q3_E |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
2 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
解决方案
我们可以mtabulate
通过拆分使用
library(qdapTools)
cbind(df[1], do.call(cbind, lapply(df[-1],
function(x) mtabulate(strsplit(x, "")))))
或者在使用拆分每个列值之后使用 with base R
,获取频率计数,然后获取元素table
strsplit
cbind
list
cbind(df[1], do.call(cbind, lapply(df[-1], function(x) {
x1 <- strsplit(x, "")
as.data.frame.matrix(table(data.frame(ind = rep(seq_along(x1),
lengths(x1)), val = factor(unlist(x1), levels = LETTERS[1:5]))))})))
-输出
# id Q1.A Q1.B Q1.C Q1.D Q1.E Q2.A Q2.B Q2.C Q2.D Q2.E Q3.A Q3.B Q3.C Q3.D Q3.E
#1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0
#2 2 0 0 1 1 1 1 1 0 0 0 1 0 0 1 0
#3 3 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0
推荐阅读
- dialog - 显示工作表时,NSheet 控制器不会运行。
- html - 使用 flexbox 将我的徽标设置在左侧,将导航菜单设置在右侧
- python - Keras 模型溢出未知错误 | (IndexError:列表索引超出范围)
- elasticsearch - 在嵌套对象中追加数据
- regex - 从一个元素中获取文本,在另一个元素中显示
- c# - 将登录页面添加到 Swagger
- mysql - 占用所有 CPU 的 ubuntu .syslogs 后台进程
- javascript - 函数的 QUnit 测试
- unicode - PDFBox:如何设置文本书写的后备字体
- .net - 是否有具有相同公共界面的 System.Drawing.Graphics 的替代品?