Для варіанту використання, як представлено у питанні, ви також можете просто помножити логічну умову на 1
(або, можливо, навіть краще, на 1L
):
df1 <- data.frame(yr = 1951:1960)
df1$is.1957 <- 1L * (df1$yr == 1957)
df1$after.1957 <- 1L * (df1$yr >= 1957)
що дає:
> 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
Для випадків використання, як це представлено, наприклад, у відповідях @ zx8754 та @Sotos, є ще деякі варіанти, які ще не були розглянуті imo.
1) Зробіть власну make_dummies
функцію
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'))
що дає:
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) використовувати dcast
-функцію з будь-якогоdata.table або змінити форму2
dcast(df2, id + year ~ year, fun.aggregate = length)
що дає:
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
Однак це не спрацює, якщо в стовпці є повторювані значення, для яких потрібно створити манекени. У випадку, якщо потрібна певна функція агрегування, dcast
а результат dcast
необхідності злиття назад до оригіналу:
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)
що дає (зверніть увагу, що результат упорядковується відповідно до by
стовпця):
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) використовувати spread
-функцію відтидир(з mutate
відdplyr)
library(dplyr)
library(tidyr)
df2 %>%
mutate(v = 1, yr = year) %>%
spread(yr, v, fill = 0)
що дає:
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