Untuk kasus penggunaan seperti yang disajikan dalam pertanyaan, Anda juga dapat mengalikan kondisi logis dengan 1(atau mungkin lebih baik, dengan 1L):
df1 <- data.frame(yr = 1951:1960)
df1$is.1957 <- 1L * (df1$yr == 1957)
df1$after.1957 <- 1L * (df1$yr >= 1957)
pemberian yang mana:
> 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
Untuk usecases seperti yang disajikan dalam contoh jawaban dari @ zx8754 dan @Sotos, masih ada beberapa opsi lain yang belum dibahas imo.
1) Buat make_dummiesfungsi Anda sendiri
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'))
pemberian yang mana:
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) gunakan dcast-fungsi dari keduanyatabel data atau membentuk kembali2
dcast(df2, id + year ~ year, fun.aggregate = length)
pemberian yang mana:
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
Namun, ini tidak akan berfungsi ketika ada nilai duplikat di kolom yang harus dibuat boneka. Dalam kasus fungsi agregasi khusus diperlukan untuk dcastdan hasil dari dcastkebutuhan untuk digabungkan kembali ke aslinya:
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)
yang memberi (perhatikan bahwa hasilnya diurutkan menurut bykolom):
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) gunakan spread-fungsi daritidyr(dengan mutatedaridplyr)
library(dplyr)
library(tidyr)
df2 %>%
mutate(v = 1, yr = year) %>%
spread(yr, v, fill = 0)
pemberian yang mana:
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