Đối với usecase như được trình bày trong câu hỏi, bạn cũng có thể chỉ cần nhân điều kiện logic với 1
(hoặc thậm chí có thể tốt hơn, với 1L
):
df1 <- data.frame(yr = 1951:1960)
df1$is.1957 <- 1L * (df1$yr == 1957)
df1$after.1957 <- 1L * (df1$yr >= 1957)
mang lại:
> 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
Đối với các tiện ích như được trình bày trong ví dụ: câu trả lời của @ zx8754 và @Sotos, vẫn còn một số tùy chọn khác chưa được đề cập đến trên imo.
1) Tạo make_dummies
chức năng của riêng bạn
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'))
mang lại:
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) sử dụng dcast
chức năng từ một trong haibảng dữ liệu hoặc là reshape2
dcast(df2, id + year ~ year, fun.aggregate = length)
mang lại:
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
Tuy nhiên, điều này sẽ không hoạt động khi có các giá trị trùng lặp trong cột mà các hình nộm phải được tạo. Trong trường hợp một hàm tổng hợp cụ thể là cần thiết dcast
và kết quả của việc dcast
cần được hợp nhất trở lại ban đầ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)
mà cho (lưu ý rằng kết quả được sắp xếp theo by
cột):
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) sử dụng spread
chức năng từngười dọn dẹp(với mutate
từdplyr)
library(dplyr)
library(tidyr)
df2 %>%
mutate(v = 1, yr = year) %>%
spread(yr, v, fill = 0)
mang lại:
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