首页 > 解决方案 > 根据字符串模式匹配拆分数据框列

问题描述

问题 - 数据整理:

我想微调多项选择题考试的注释,每个问题有 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

标签: rdataframesplit

解决方案


我们可以mtabulate通过拆分使用

library(qdapTools)
cbind(df[1], do.call(cbind, lapply(df[-1],
       function(x) mtabulate(strsplit(x, "")))))

或者在使用拆分每个列值之后使用 with base R,获取频率计数,然后获取元素tablestrsplitcbindlist

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

推荐阅读