जैसा कि शीर्षक से पता चलता है कि मेरी समस्या निम्नलिखित है। मेरे पास एक घटना की शुरुआत की पहचान करने वाला एक चर है और दूसरा चर उसी घटना के अंत समय को दर्शाता है। मैं एक चर चाहता हूं जो इंगित करता है कि कोई घटना हुई या नहीं।

dat <-
  data.frame(
    "t" = c(1:10),
    "id1" = c(1, NA, NA, NA, 2, 3, NA, NA, 4, NA),
    "id2" = c(NA, 1, NA, NA, NA, 2, NA, 3, 4, NA),
    "desiredoutcome" = c(1, 1, 0, 0, 1, 1, 1, 1,1, 0)
  )

यहां, जब भी यह id1 और id2 के समान मान के बीच होता है, तो चर वांछित परिणाम मान 1 लेगा। उदाहरण पर विचार करें पंक्ति 6. यह आईडी = 2 और आईडी = 3 दोनों के बीच है और इसलिए डमी 1 होनी चाहिए। कोई विचार है कि मैं इसे कैसे प्राप्त कर सकता हूं?

0
Tordir 3 सितंबर 2021, 11:07

2 जवाब

सबसे बढ़िया उत्तर

इस बारे में कैसा है ?

#Position of non-NA index in `id1`
inds1 <- which(!is.na(dat$id1))
#Corresponding position of non-NA index in `id2`
inds2 <- match(dat$id1[inds1], dat$id2)
#Initialise the result column to 0
dat$result <- 0
#create a sequence between inds1 and inds2 and assign value as 1.
dat$result[unique(unlist(Map(seq, inds1, inds2)))] <- 1
dat

#    t id1 id2 desiredoutcome result
#1   1   1  NA              1      1
#2   2  NA   1              1      1
#3   3  NA  NA              0      0
#4   4  NA  NA              0      0
#5   5   2  NA              1      1
#6   6   3   2              1      1
#7   7  NA  NA              1      1
#8   8  NA   3              1      1
#9   9   4   4              1      1
#10 10  NA  NA              0      0
1
Ronak Shah 3 सितंबर 2021, 08:59

इसे करने का एक तरीका यहां दिया गया है,

पहले NA को 0 में बदलें,

dat[is.na(dat)] <- 0

तब हम ifelse . का उपयोग करते हैं

ifelse((dat$id1 == 0 & dat$id2 == 0), 0, 1)

डेटाफ्रेम के रूप में,

dat = cbind(dat, ifelse((dat$id1 == 0 & dat$id2 == 0), 0, 1))
0
Nad Pat 3 सितंबर 2021, 08:21