一个热码从R中多行(One Hot Encoding From Multiple Rows in R

2019-09-26 03:56发布

假设我有一个具有以下格式的数据:

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

另一部分,这是我的数据帧是大约30万行 - 所以我在寻找一种有效的方式来做到这一点。 任何帮助或意见,将不胜感激!

谢谢!

Answer 1:

你可以使用table

d <- table(df$ID, df$VALUE)
#    a b c
#  a 1 2 0
#  d 0 1 1

如果你因为某些组合出现不止一次地强制执行的1或0的值,那么你可以将这些情况转换为1:

d[d > 1L] <- 1
#    a b c
#  a 1 1 0
#  d 0 1 1

实施例的数据

df <- structure(list(ID = c("a", "a", "a", "d", "d"), VALUE = c("a", "b", "b", "b", "c")),
   .Names = c("ID", "VALUE"), class = "data.frame", row.names = c(NA, -5L))


Answer 2:

一种选择是dcastdata.table转换,从“长”“宽”格式。 转换'data.frame'到'data.table'( setDT(df)它重塑为“wide'format与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)


文章来源: One Hot Encoding From Multiple Rows in R