Достаточно прямой подход состоит в том, чтобы просто использовать table
для каждого столбца, табулируя значения в столбце числом строк в data.frame
:
allLevels <- levels(factor(unlist(df)))
do.call(cbind,
lapply(df, function(x) table(sequence(nrow(df)),
factor(x, levels = allLevels))))
# a b c a b c
# 1 0 1 0 0 0 1
# 2 1 0 0 1 0 0
# 3 0 0 1 0 0 1
# 4 0 1 0 1 0 0
# 5 0 0 1 0 0 1
# 6 0 0 1 0 1 0
# 7 1 0 0 1 0 0
# 8 1 0 0 0 1 0
# 9 1 0 0 0 0 1
# 10 1 0 0 0 1 0
Я использовал factor
на «x», чтобы убедиться, что даже в тех случаях, когда в столбце нет значений «c», на выходе все равно будет столбец «c», заполненный нулями.