इसी तरह के प्रश्न पहले भी पूछे जा चुके हैं, जहां सवाल यह है कि किसी घटना के बाद से टिप्पणियों की संख्या की गणना कैसे की जाए। मेरा एक और अनुरोध है। एक ही प्रकार के अवलोकन के बाद से दिनों की संख्या की गणना कैसे करें, लेकिन किसी अन्य प्रकार की घटना के बाद के दिनों की संख्या कैसे ज्ञात करें। मेरे पास आईडी भी हैं।

वर्णन करने के लिए कृपया नीचे देखें। मैं डेटाटेबल्स का उपयोग करके आर में ऐसा करने की कोशिश कर रहा हूं लेकिन कम परिणाम के लिए।

जो मेरे पास है:

  date     event  id
2000-07-06     2  1
2000-07-07     1  1
2000-07-09     0  1
2000-07-10     0  1
2000-07-15     2  1
2000-07-16     1  1
2000-07-20     0  1
2000-07-21     1  1
2000-07-06     1  2
2000-07-07     2  2
2000-07-15     0  2
2000-07-16     0  2
2000-07-17     2  2
2000-07-18     1  2

और मैं जो चाहता हूं वह इस प्रकार है:

  date     event  id days_since_event_1 days_since_event_2
2000-07-06     2  1        NA                 NA
2000-07-07     1  1        NA                 1
2000-07-09     0  1        2                  3
2000-07-10     0  1        3                  4
2000-07-15     2  1        8                  9
2000-07-16     1  1        9                  1
2000-07-20     0  1        4                  5
2000-07-21     1  1        5                  6
2000-07-06     1  2        NA                 NA
2000-07-07     2  2        1                  NA
2000-07-15     0  2        9                  8
2000-07-16     0  2        10                 9
2000-07-17     2  2        11                 10
2000-07-18     1  2        12                 1

दो घटनाएँ परस्पर अनन्य हैं, अर्थात वे एक ही दिन नहीं हो सकती हैं। कुछ अच्छी सलाह सुनने की उम्मीद है। शुभकामनाएं।

2
Rnovice 24 मार्च 2020, 14:25

2 जवाब

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

निम्नलिखित तिथियों में अंतर की गणना करने के लिए Chron लाइब्रेरी का उपयोग करता है

library(chron)

df$date <- chron(as.character(df$date),format=c(date="y-m-d"))

for(j in unique(df$id)){
  DaysSince1 <-NA
  DaysSince2 <-NA
  RowsWithID <- grep(j,df$id)

  for(i in RowsWithID){
    df$days_since_event_1[i] <- df$date[i]-df$date[i-DaysSince1]
    df$days_since_event_2[i] <- df$date[i]-df$date[i-DaysSince2]

    if(df$event[i]==1){DaysSince1<-1}
      else{DaysSince1<-DaysSince1+1}

    if(df$event[i]==2){DaysSince2<-1}
      else{DaysSince2<-DaysSince2+1}
  }
}

यह कोड निम्नलिखित परिणाम देता है

> df
       date event id days_since_event_1 days_since_event_2
1  00-07-06     2  1                 NA                 NA
2  00-07-07     1  1                 NA                  1
3  00-07-09     0  1                  2                  3
4  00-07-10     0  1                  3                  4
5  00-07-15     2  1                  8                  9
6  00-07-16     1  1                  9                  1
7  00-07-20     0  1                  4                  5
8  00-07-21     1  1                  5                  6
9  00-07-06     1  2                 NA                 NA
10 00-07-07     2  2                  1                 NA
11 00-07-15     0  2                  9                  8
12 00-07-16     0  2                 10                  9
13 00-07-17     2  2                 11                 10
14 00-07-18     1  2                 12                  1

अपनी टिप्पणी को संबोधित करने के लिए, आप दिनों के बजाय टिप्पणियों की संख्या प्राप्त करने के लिए Base R में निम्न कार्य कर सकते हैं। पुस्तकालयों की जरूरत नहीं है।

for(j in unique(df$id)){
  ObsSince1 <-NA
  ObsSince2 <-NA
  RowsWithID <- grep(j,df$id)

  for(i in RowsWithID){
    df$Obs_since_event_1[i] <- ObsSince1
    df$Obs_since_event_2[i] <- ObsSince2

    if(df$event[i]==1){ObsSince1<-1}
    else{ObsSince1<-ObsSince1+1}

    if(df$event[i]==2){ObsSince2<-1}
    else{ObsSince2<-ObsSince2+1}
  }
}

आपको निम्न आउटपुट मिलना चाहिए

> df
         date event id Obs_since_event_1 Obs_since_event_2
1  2000-07-06     2  1                NA                NA
2  2000-07-07     1  1                NA                 1
3  2000-07-09     0  1                 1                 2
4  2000-07-10     0  1                 2                 3
5  2000-07-15     2  1                 3                 4
6  2000-07-16     1  1                 4                 1
7  2000-07-20     0  1                 1                 2
8  2000-07-21     1  1                 2                 3
9  2000-07-06     1  2                NA                NA
10 2000-07-07     2  2                 1                NA
11 2000-07-15     0  2                 2                 1
12 2000-07-16     0  2                 3                 2
13 2000-07-17     2  2                 4                 3
14 2000-07-18     1  2                 5                 1
2
Daniel O 24 मार्च 2020, 16:15
इस उत्तर के लिए धन्यवाद। मुझे अब पता चला है कि मुझे वास्तव में प्रत्येक घटना के बीच दिनों की संख्या में दिलचस्पी नहीं है, बल्कि अवलोकनों की संख्या में है। क्या आपके पास कोई फिक्स है? या शायद यह स्टैक एक्सचेंज पर यहां पोस्ट किया जाने वाला एक अन्य प्रश्न है।
 – 
Rnovice
24 मार्च 2020, 15:56
मैंने आपकी नई समस्या के लिए "फिक्स" शामिल करने के लिए अपनी प्रतिक्रिया संपादित की है। कृपया इसे उत्तर के रूप में चिह्नित करने पर विचार करें यदि यह आपकी आवश्यकताओं के लिए काम करता है,
 – 
Daniel O
24 मार्च 2020, 16:08

आप एक विशिष्ट ईवेंट एन्कोडिंग के साथ सभी के लिए अपनी तिथियों को सब्मिट कर सकते हैं, जैसे:

date.2 = DATAFRAME[which(DATAFRAME[,2]==2),1]

और फिर बस करो

DATAFRAME[which(DATAFRAME[,2]==2),5] = as.numeric(diff.Date(date.2))

और इसी तरह। शायद यह करना और भी आसान है, लेकिन मेरे दिमाग में यह पहली बात आ रही थी। DATAFRAME यहाँ आपके डेटाफ़्रेम का नाम मात्र है।

संपादित करें: अगर मैं इसे सही ढंग से देखता हूं तो आप एनए चाहते हैं जहां आईडी और इवेंट कॉलम एक-दूसरे से अलग हों? तब आप इसके साथ आगे बढ़ सकते हैं: डेटाफ़्रेम [जो (डेटाफ़्रेम [, 2]! = डेटाफ़्रेम [, 3]), सी (4,5)] = एनए या ऐसा कुछ

2
Erin Sprünken 24 मार्च 2020, 14:42
नमस्ते, हाँ NA होगा क्योंकि उस ID के लिए कोई पूर्ववर्ती घटना नहीं हुई है। मैंने महसूस किया है कि मैंने प्रश्न को गलत टाइप कर दिया है और मुझे टिप्पणियों के बीच दिनों की संख्या की आवश्यकता नहीं है, बल्कि प्रत्येक घटना के बीच टिप्पणियों की संख्या की आवश्यकता है।
 – 
Rnovice
24 मार्च 2020, 15:45