将字符串列编码为几个虚拟列

时间:2019-06-11 15:26:58

标签: r string dataframe split

我想获取以下格式的数据

     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函数可以轻松地解决此问题,但是我一直找不到。感谢您的指导!

2 个答案:

答案 0 :(得分:0)

一种选择是将字符串列除以/并使用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"))

答案 1 :(得分:0)

使用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)