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
from
data.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