Pour le cas d'utilisation présenté dans la question, vous pouvez aussi simplement multiplier la condition logique par 1
(ou peut-être encore mieux, avec 1L
) :
# example data
df1 <- data.frame(yr = 1951:1960)
# create the dummies
df1$is.1957 <- 1L * (df1$yr == 1957)
df1$after.1957 <- 1L * (df1$yr >= 1957)
ce qui donne :
> df1
yr is.1957 after.1957
1 1951 0 0
2 1952 0 0
3 1953 0 0
4 1954 0 0
5 1955 0 0
6 1956 0 0
7 1957 1 1
8 1958 0 1
9 1959 0 1
10 1960 0 1
Pour les cas d'utilisation présentés par exemple dans les réponses de @zx8754 et @Sotos, il existe encore d'autres options qui n'ont pas encore été couvertes.
1) Faites votre propre make_dummies
-fonction
# example data
df2 <- data.frame(id = 1:5, year = c(1991:1994,1992))
# create a function
make_dummies <- function(v, prefix = '') {
s <- sort(unique(v))
d <- outer(v, s, function(v, s) 1L * (v == s))
colnames(d) <- paste0(prefix, s)
d
}
# bind the dummies to the original dataframe
cbind(df2, make_dummies(df2$year, prefix = 'y'))
ce qui donne :
id year y1991 y1992 y1993 y1994
1 1 1991 1 0 0 0
2 2 1992 0 1 0 0
3 3 1993 0 0 1 0
4 4 1994 0 0 0 1
5 5 1992 0 1 0 0
2) utiliser le dcast
-de l'une ou l'autre des fonctions suivantes table.de.données o remodeler2
dcast(df2, id + year ~ year, fun.aggregate = length)
ce qui donne :
id year 1991 1992 1993 1994
1 1 1991 1 0 0 0
2 2 1992 0 1 0 0
3 3 1993 0 0 1 0
4 4 1994 0 0 0 1
5 5 1992 0 1 0 0
Cependant, cela ne fonctionne pas lorsqu'il y a des valeurs en double dans la colonne pour laquelle les mannequins doivent être créés. Dans le cas où une fonction d'agrégation spécifique est nécessaire pour les dcast
et le résultat de de dcast
doivent être fusionnés à l'original :
# example data
df3 <- data.frame(var = c("B", "C", "A", "B", "C"))
# aggregation function to get dummy values
f <- function(x) as.integer(length(x) > 0)
# reshape to wide with the cumstom aggregation function and merge back to the original
merge(df3, dcast(df3, var ~ var, fun.aggregate = f), by = 'var', all.x = TRUE)
ce qui donne (notez que le résultat est ordonné en fonction de l'indice by
colonne) :
var A B C
1 A 1 0 0
2 B 0 1 0
3 B 0 1 0
4 C 0 0 1
5 C 0 0 1
3) utiliser le spread
-fonction de tidyr (avec mutate
de dplyr )
library(dplyr)
library(tidyr)
df2 %>%
mutate(v = 1, yr = year) %>%
spread(yr, v, fill = 0)
ce qui donne :
id year 1991 1992 1993 1994
1 1 1991 1 0 0 0
2 2 1992 0 1 0 0
3 3 1993 0 0 1 0
4 4 1994 0 0 0 1
5 5 1992 0 1 0 0