假设我有一个具有以下格式的数据:
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万行 - 所以我在寻找一种有效的方式来做到这一点。 任何帮助或意见,将不胜感激!
谢谢!
你可以使用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))
一种选择是dcast
从data.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)