【问题标题】:Encode string column as several dummy columns [duplicate]将字符串列编码为几个虚拟列[重复]
【发布时间】:2019-06-11 15:26:58
【问题描述】:

我想获取表单的数据

     names   label
1    A/B     V
2    A       W
3    A/C/D   X
4    B/C     Y
5    B/D     Z

并将“名称”列编码为多个包含虚拟变量的列,该变量显示是否包含特定名称,即

     A   B   C   D   label
1    1   1   0   0   V
2    1   0   0   0   W
3    1   0   1   1   X
4    0   1   1   0   Y
5    0   1   0   1   Z

感觉应该有一个 R 函数可以轻松解决这个问题,但我一直找不到。感谢您的任何指点!

【问题讨论】:

    标签: r string dataframe split


    【解决方案1】:

    一个选项是用/ 分割字符串列并使用mtabulate

    library(qdapTools)
    cbind(mtabulate(strsplit(df1$names, "/")), df1['label'])
    #   A B C D label
    #1 1 1 0 0     V
    #2 1 0 0 0     W
    #3 1 0 1 1     X
    #4 0 1 1 0     Y
    #5 0 1 0 1     Z
    

    或在base R

    table(stack(setNames(strsplit(df1$names, "/"), df1$label))[2:1])
    

    没有使用任何包

    数据

    df1 <- structure(list(names = c("A/B", "A", "A/C/D", "B/C", "B/D"), 
    label = c("V", "W", "X", "Y", "Z")), class = "data.frame", 
     row.names = c("1", "2", "3", "4", "5"))
    

    【讨论】:

      【解决方案2】:

      使用separate_rows 将其放入长格式,然后table 将产生输出。转置以使其按问题中显示的方向。

      library(dplyr)
      library(tidyr)
      DF %>%
        separate_rows(names) %>%
        table %>%
        t
      

      给予:

           names
      label A B C D
          V 1 1 0 0
          W 1 0 0 0
          X 1 0 1 1
          Y 0 1 1 0
          Z 0 1 0 1
      

      注意

      可重现形式的输入:

      Lines <- "names   label
      1    A/B     V
      2    A       W
      3    A/C/D   X
      4    B/C     Y
      5    B/D     Z"
      DF <- read.table(text = Lines, as.is = TRUE)
      

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-18
        • 2016-07-05
        • 2012-01-06
        相关资源
        最近更新 更多