我想获取以下格式的数据
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函数可以轻松地解决此问题,但是我一直找不到。感谢您的指导!
答案 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)