Я предпочитаю ответ @ akrun для простоты, но некоторые альтернативы:
Данные:
dat <- data.frame(y=c(1,2,3,3))
dat$id <- seq_len(nrow(dat))
dat$one <- 1L
С добавленным полем "id" для сохранения отдельных / уникальных строк.Поскольку я меняю данные, мне нужно сохранить значение, поэтому временная переменная "one".
База R
dat_base <- reshape(dat, idvar="id", v.names="one", timevar="y", direction="wide")
dat_base[2:4] <- lapply(dat_base[2:4], function(a) replace(a, is.na(a), 0))
dat_base
# id one.1 one.2 one.3
# 1 1 1 0 0
# 2 2 0 1 0
# 3 3 0 0 1
# 4 4 0 0 1
dplyr
library(dplyr)
library(tidyr)
dat %>%
spread(y, one) %>%
mutate_all(~if_else(is.na(.), 0L, .))
# id 1 2 3
# 1 1 1 0 0
# 2 2 0 1 0
# 3 3 0 0 1
# 4 4 0 0 1
data.table
library(data.table)
datdt <- as.data.table(dat)
dcast(datdt, id ~ y, value.var = "one", fill = 0)
# id 1 2 3
# 1: 1 1 0 0
# 2: 2 0 1 0
# 3: 3 0 0 1
# 4: 4 0 0 1