首页 文章

如何在dplyr中用不等列(反向toString)分隔

提问于
浏览
3

我正在使用调查数据尝试在一个列中进行多个响应 . 问题是可能有1-5个答案,用逗号分隔 .

我怎么转这个:

df <- data.frame(
  splitThis = c("A,B,C","B,C","A,C","A","B","C")
)

> df
  splitThis
1     A,B,C
2       B,C
3       A,C
4         A
5         B
6         C

进入:

intoThis <- data.frame(
  A = c(1,0,1,1,0,0),
  B = c(1,1,0,0,1,0),
  c = c(1,1,1,0,0,1)
)

 > intoThis
  A B c
1 1 1 1
2 0 1 1
3 1 0 1
4 1 0 0
5 0 1 0
6 0 0 1

任何争吵帮助升值!

1 回答

  • 4

    我们可以在分割 , 之后使用 mtabulate 来自 qdapTools

    library(qdapTools)
    mtabulate(strsplit(as.character(df$splitThis), ","))
    #  A B C
    #1 1 1 1
    #2 0 1 1
    #3 1 0 1
    #4 1 0 0
    #5 0 1 0
    #6 0 0 1
    

    由于OP也提到 dplyr/tidyr

    library(dplyr)
    library(tidyr)
    library(tibble)
    rownames_to_column(df, "rn") %>% 
              separate_rows(splitThis) %>%
              table()
    

    或使用 tidyverse

    rownames_to_column(df, "rn") %>%
            separate_rows(splitThis) %>% 
            group_by(rn, splitThis) %>% 
            tally %>% 
            spread(splitThis, n, fill=0) %>%
            ungroup() %>% 
            select(-rn)
    # A tibble: 6 × 3
    #      A     B     C
    #* <dbl> <dbl> <dbl>
    #1     1     1     1
    #2     0     1     1
    #3     1     0     1
    #4     1     0     0
    #5     0     1     0
    #6     0     0     1
    

相关问题