Usecase के लिए जैसा कि प्रश्न में प्रस्तुत किया गया है, आप केवल तार्किक स्थिति को 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 और @Sosos के उदाहरण के रूप में प्रस्तुत किए गए usecases के लिए, अभी भी कुछ अन्य विकल्प हैं, जिन्हें अभी तक कवर नहीं किया गया है।
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 या तो से -function काविवरण सारणी या reshape2
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 से -function काtidyr (साथ में 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