Für den in der Frage dargestellten Anwendungsfall können Sie die logische Bedingung auch einfach mit 1
(oder vielleicht sogar besser mit 1L
) multiplizieren :
# 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)
was gibt:
> 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
Für die Anwendungsfälle, wie sie beispielsweise in den Antworten von @ zx8754 und @Sotos dargestellt sind, gibt es noch einige andere Optionen, die imo noch nicht behandelt wurden.
1) Machen Sie Ihre eigenen make_dummies
-function
# 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'))
was gibt:
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) Verwenden Sie die Funktion dcast
von entwederDatentabelle oder umformen2
dcast(df2, id + year ~ year, fun.aggregate = length)
was gibt:
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
Dies funktioniert jedoch nicht, wenn die Spalte, für die die Dummies erstellt werden müssen, doppelte Werte enthält. In dem Fall, dass eine bestimmte Aggregationsfunktion benötigt wird dcast
und das Ergebnis der dcast
Notwendigkeit wieder mit dem Original zusammengeführt werden muss:
# 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)
was gibt (beachten Sie, dass das Ergebnis nach der by
Spalte geordnet ist ):
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) Verwenden Sie die spread
-Funktion vontidyr(mit mutate
vondplyr)
library(dplyr)
library(tidyr)
df2 %>%
mutate(v = 1, yr = year) %>%
spread(yr, v, fill = 0)
was gibt:
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