W przypadku zastosowania przedstawionym w pytaniu możesz również pomnożyć warunek logiczny przez 1
(lub może nawet lepiej, przez 1L
):
df1 <- data.frame(yr = 1951:1960)
df1$is.1957 <- 1L * (df1$yr == 1957)
df1$after.1957 <- 1L * (df1$yr >= 1957)
co daje:
> 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
W przypadku zastosowań przedstawionych na przykład w odpowiedziach @ zx8754 i @Sotos, jest jeszcze kilka innych opcji, które nie zostały jeszcze omówione w imo.
1) Stwórz własną make_dummies
funkcję
df2 <- data.frame(id = 1:5, year = c(1991:1994,1992))
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
}
cbind(df2, make_dummies(df2$year, prefix = 'y'))
co daje:
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) użyj funkcji dcast
z jednego z nichTabela danych lub reshape2
dcast(df2, id + year ~ year, fun.aggregate = length)
co daje:
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
Jednak to nie zadziała, jeśli w kolumnie znajdują się zduplikowane wartości, dla których trzeba utworzyć atrapy. W przypadku, gdy potrzebna jest konkretna funkcja agregująca dcast
i wynik dcast
konieczności scalenia z powrotem do oryginału:
df3 <- data.frame(var = c("B", "C", "A", "B", "C"))
f <- function(x) as.integer(length(x) > 0)
merge(df3, dcast(df3, var ~ var, fun.aggregate = f), by = 'var', all.x = TRUE)
co daje (zwróć uwagę, że wynik jest uporządkowany zgodnie z by
kolumną):
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) użyj spread
ztidyr(z mutate
oddplyr)
library(dplyr)
library(tidyr)
df2 %>%
mutate(v = 1, yr = year) %>%
spread(yr, v, fill = 0)
co daje:
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