मान लें कि मैंने आर में एक डेटा दिया है जिसमें तीन कॉलम (0,1) -एंट्रीज हैं:

c1 <- c(0,1,0,0,1,0)
c2 <- c(0,0,1,0,0,1)
c3 <- c(0,1,0,1,0,0)

data <- data.frame(cbind(c1,c2,c3))

मैं c2 में उन पंक्तियों की पहचान करना चाहता हूं जिनका मान 1 है और जहां c1 में पिछली पंक्ति और c3 में निम्न पंक्ति का भी मान 1 है।

तो सिद्धांत रूप में कुछ इस तरह है:

which(data$c2 == 1 & data$c1[previous] == 1 & data$c3[following] == 1)

यहाँ उदाहरण में यह मुझे 3 देना चाहिए। क्या कोई जानता है कि यह कैसे करना है?

r
0
W. Walter 11 पद 2020, 15:45

3 जवाब

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

आप lead और lag का उपयोग dplyr से कर सकते हैं:

library(dplyr)

which(data$c2 == 1 & lag(data$c1) == 1 & lead(data$c3 == 1))
#> [1] 3
1
Allan Cameron 11 पद 2020, 15:56

लूप का उपयोग करना:

#Data
c1 <- c(0,1,0,0,1,0)
c2 <- c(0,0,1,0,0,1)
c3 <- c(0,1,0,1,0,0)
data <- data.frame(cbind(c1,c2,c3))
#Vector
rows <- c()
#Rows
vr <- c(2:(nrow(data)-1))
#Loop
for(i in 1:length(vr))
{
  if(data$c2[vr[i]]==1 & data$c1[vr[i]-1]==1 & data$c3[vr[i]+1]==1)
  {rows[i]<- vr[i]}
  rows <- rows[!is.na(rows)]
}

आउटपुट:

rows
[1] 3
1
Duck 11 पद 2020, 15:57

आधार आर में, आप यह कर सकते हैं:

inds <- which(c(NA, head(data$c1, -1)) & data$c2 == 1 & c(tail(data$c3, -1), NA))
inds

#[1] 3
1
Ronak Shah 11 पद 2020, 16:01