R中多行的一个热编码
假设我有以下格式的数据:R中多行的一个热编码,r,matrix,machine-learning,R,Matrix,Machine Learning,假设我有以下格式的数据: ID VALUE a a a b d b d c 我想做的是对ID值进行一次热编码。当我使用model.matrix时,我得到: model.matrix(~VALUE-1, df) ID aVALUE bVALUE cVALUE a 1 0 0 a 0 1 0 d 0 1 0 d 0 0 1 然而,我想得到的是: ID aVALUE bVALUE cVALUE a
ID VALUE
a a
a b
d b
d c
我想做的是对ID值进行一次热编码。当我使用model.matrix
时,我得到:
model.matrix(~VALUE-1, df)
ID aVALUE bVALUE cVALUE
a 1 0 0
a 0 1 0
d 0 1 0
d 0 0 1
然而,我想得到的是:
ID aVALUE bVALUE cVALUE
a 1 1 0
d 0 1 1
另一方面,我的数据帧大约有3000万行,因此我正在寻找一种有效的方法来实现这一点。任何帮助或意见将不胜感激
谢谢大家! 您可以使用
表格
d <- table(df$ID, df$VALUE)
# a b c
# a 1 2 0
# d 0 1 1
d1l]您可以使用表格
d <- table(df$ID, df$VALUE)
# a b c
# a 1 2 0
# d 0 1 1
d1l]一个选项是dcast
fromdata.table
从“long”转换为“wide”格式。将“data.frame”转换为“data.table”(setDT(df)
),使用dcast
将其重塑为“宽”格式,并指定fun.aggregate
。对于大型数据集,dcast
方法将是快速的
library(data.table)
dcast(setDT(df), ID~paste0(VALUE, "VALUE"), value.var = "VALUE",
function(x) as.integer(length(x) > 0))
# ID aVALUE bVALUE cVALUE
#1: a 1 1 0
#2: d 0 1 1
另一个选项是dplyr/tidyr
library(dplyr)
library(tidyr)
df %>%
unique() %>%
mutate(n = 1)%>%
spread(VALUE, n, fill = 0)
一个选项是data.table
中的dcast
,用于从“long”转换为“wide”格式。将“data.frame”转换为“data.table”(setDT(df)
),使用dcast
将其重塑为“宽”格式,并指定fun.aggregate
。对于大型数据集,dcast
方法将是快速的
library(data.table)
dcast(setDT(df), ID~paste0(VALUE, "VALUE"), value.var = "VALUE",
function(x) as.integer(length(x) > 0))
# ID aVALUE bVALUE cVALUE
#1: a 1 1 0
#2: d 0 1 1
另一个选项是dplyr/tidyr
library(dplyr)
library(tidyr)
df %>%
unique() %>%
mutate(n = 1)%>%
spread(VALUE, n, fill = 0)
@佐塔-这确实有效!谢谢如果你想把它作为一个答案,我很乐意接受-@Jota@Jota-这确实有效!谢谢如果你想把它作为一个答案,我很乐意接受它-@Jota