Просто используйте table
, как это:
cbind(DF, as.data.frame.matrix(table(sequence(nrow(DF)), DF$year)))
year id var ans 2010 2011
1 2010 1 1 1 1 0
2 2010 2 0 0 1 0
3 2010 1 0 1 1 0
4 2010 1 0 1 1 0
5 2011 2 1 1 0 1
6 2011 2 0 1 0 1
7 2011 1 0 0 0 1
8 2011 1 0 0 0 1
Вы также должны быть в состоянии сделать что-то вроде этого:
library(data.table)
cbind(DF,
dcast.data.table(as.data.table(DF, keep.rownames = TRUE),
rn ~ year, value.var = "id", fun.aggregate = length))
# year id var ans rn 2010 2011
# 1 2010 1 1 1 1 1 0
# 2 2010 2 0 0 2 1 0
# 3 2010 1 0 1 3 1 0
# 4 2010 1 0 1 4 1 0
# 5 2011 2 1 1 5 0 1
# 6 2011 2 0 1 6 0 1
# 7 2011 1 0 0 7 0 1
# 8 2011 1 0 0 8 0 1
Если вы хотите имена, чтобы быть " year_2010 "и так далее, я думаю, что обходным решением было бы сделать что-то вроде этого:
dcast.data.table(as.data.table(DF, keep.rownames = TRUE)[, yr := "year"],
rn ~ yr + year, value.var = "id", fun.aggregate = length)
Вы также всегда можете написать свою собственную функцию. Вот один я взбитыми вместе, что должно быть достаточно эффективным:
dummyCreator <- function(invec, prefix = NULL) {
L <- length(invec)
ColNames <- sort(unique(invec))
M <- matrix(0L, ncol = length(ColNames), nrow = L,
dimnames = list(NULL, ColNames))
M[cbind(seq_len(L), match(invec, ColNames))] <- 1L
if (!is.null(prefix)) colnames(M) <- paste(prefix, colnames(M), sep = "_")
M
}
dummyCreator(DF$year, prefix = "year")
# year_2010 year_2011
# [1,] 1 0
# [2,] 1 0
# [3,] 1 0
# [4,] 1 0
# [5,] 0 1
# [6,] 0 1
# [7,] 0 1
# [8,] 0 1
Просто используйте cbind
, как описано выше, чтобы получить выход вы ожидаете.
В DF у вас уже есть «год». Это то, чего вы ожидаете? Или это часть ДФ? – jazzurro
@jazzurro Мне нужны фиктивные переменные столбцы, дифференцирующие годы. – Vedda
Пожалуйста, покажите желаемый результат с помощью этого ввода. – A5C1D2H2I1M1N2O1R2T1