Вот вариант, использующий data.table
:
vs <- DT[, unique(variable)]
for (x in vs) set(DT, j=x, value=0L)
DT[, (vs) := {
m <- as.matrix(.SD)
m[, match(variable, vs)] <- 1L
as.data.table(m)
}, year, .SD=vs]
DT
А также:
DT[, (vs) := {
m <- copy(.SD)
m[, match(variable, vs)] <- 1L
m
}, year, .SD=vs]
вывод в соответствии с описанием проблемы (как указано Дэниелом О и Мериопсом, есть некоторые несоответствия между желаемым результатом и описанием проблемы):
year variable ab cd ef gh
1: 2014 ab 1 1 1 0
2: 2014 cd 1 1 1 0
3: 2014 ef 1 1 1 0
4: 2016 ef 0 0 1 1
5: 2016 gh 0 0 1 1
data:
library(data.table)
DT <- fread("year variable
2014 ab
2014 cd
2014 ef
2016 ef
2016 gh")