多列之间的R多热编码
R multi-hot encoding among multiple columns
我的数据是这样的
Event Id Var1 Var2 Var3
1 a x w y
2 a z y w
3 b x y q
我需要为 table 中的每一行创建多热编码向量,考虑到出现在 Var1、Var2 和 Var3 中的所有值。
这意味着所需的输出将是:
Event Id x y z w q
1 a 1 1 0 1 0
2 a 0 1 1 1 0
3 b 1 1 0 0 1
这意味着我保留了与初始数据集相同的行数,我只为每一行添加了等于 Var 1、Var 2 和 Var3 中所有唯一因子的列数。
我尝试了所有我能想到的方法,但到目前为止似乎没有任何效果..
有什么想法吗?
我们可以gather
转换成'long'格式,然后做一个spread
library(tidyverse)
gather(df1, key, val, Var1:Var3) %>%
mutate(n = 1) %>%
select(-key) %>%
spread(val, n, fill = 0)
或者以紧凑的方式
library(qdapTools)
cbind(df1[1:2], +(mtabulate(df1[-(1:2)]) > 0))
可以使用data.table
-
dt <- read.table(text="Event Id Var1 Var2 Var3
1 a x w y
2 a z y w
3 b x y q",header=T)
setDT(dt)
dcast(setDT(melt(dt,id.vars = c("Event","Id")))[,ind:=1],Event+Id~value,value.var = "ind",fill=0)
输出-
Event Id Var1 Var2 Var3 q w x y z
1: 1 a 1 1 1 0 1 1 1 0
2: 2 a 1 1 1 0 1 0 1 1
3: 3 b 1 1 1 1 0 1 1 0
我的数据是这样的
Event Id Var1 Var2 Var3
1 a x w y
2 a z y w
3 b x y q
我需要为 table 中的每一行创建多热编码向量,考虑到出现在 Var1、Var2 和 Var3 中的所有值。 这意味着所需的输出将是:
Event Id x y z w q
1 a 1 1 0 1 0
2 a 0 1 1 1 0
3 b 1 1 0 0 1
这意味着我保留了与初始数据集相同的行数,我只为每一行添加了等于 Var 1、Var 2 和 Var3 中所有唯一因子的列数。
我尝试了所有我能想到的方法,但到目前为止似乎没有任何效果..
有什么想法吗?
我们可以gather
转换成'long'格式,然后做一个spread
library(tidyverse)
gather(df1, key, val, Var1:Var3) %>%
mutate(n = 1) %>%
select(-key) %>%
spread(val, n, fill = 0)
或者以紧凑的方式
library(qdapTools)
cbind(df1[1:2], +(mtabulate(df1[-(1:2)]) > 0))
可以使用data.table
-
dt <- read.table(text="Event Id Var1 Var2 Var3
1 a x w y
2 a z y w
3 b x y q",header=T)
setDT(dt)
dcast(setDT(melt(dt,id.vars = c("Event","Id")))[,ind:=1],Event+Id~value,value.var = "ind",fill=0)
输出-
Event Id Var1 Var2 Var3 q w x y z
1: 1 a 1 1 1 0 1 1 1 0
2: 2 a 1 1 1 0 1 0 1 1
3: 3 b 1 1 1 1 0 1 1 0