मेरे पास निम्न डेटा है:

  df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02"), 
                   dt2 =   c("2019-08-30", "2019-04-24", "2019-12-06") )
> df
         dt1        dt2
1 2019-05-02 2019-08-30
2 2019-01-02 2019-04-24
3 2019-06-02 2019-12-06

यहाँ मैं क्या करना चाहता हूँ:

I) मैं बिनिंग द्वारा कारक बनाना चाहता हूं, उदाहरण के लिए, पहली तारीख के लिए, दिनांक 2019-07-31, 2019-06-30, 2019-05-31, इसलिए अनिवार्य रूप से dt2 द्वारा बिनिंग।
ii) मैं प्रत्येक बिन में तारीखों की कुल संख्या गिनना चाहता हूँ।

अपेक्षित आउटपुट है:

        dt1        dt2      val_count
1 2019-05-02 2019-08-30         3
2 2019-01-02 2019-04-24         3 
3 2019-06-02 2019-12-06         6 

मुझे यह पोस्ट प्रासंगिक लगा।

नोट: मैं दो तिथियों के महीनों के बीच अंतर नहीं लेना चाहता।

सुझावों के लिए धन्यवाद।

0
Vendetta 25 नवम्बर 2021, 10:10

2 जवाब

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

यह बहुत गन्दा है लेकिन यदि आप यह गिनना चाहते हैं कि महीनों की कितनी अंतिम तिथि dt1 और dt2 के बीच है, तो आप कोशिश कर सकते हैं

library(lubridate)
library(dplyr)

fd <- paste0(lubridate::year(min(df$dt1, df$dt2)), "-02-01") %>% as.Date()

ld <- paste0(lubridate::year(max(df$dt1, df$dt2))+1, "-01-01") %>% as.Date()
x <- seq.Date(fd, ld, by = "month") - 1
df %>%
  rowwise() %>%
  mutate(val_count = length(x[dt1 < x & x < dt2]))

  dt1        dt2        val_count
  <chr>      <chr>          <int>
1 2019-05-02 2019-08-30         3
2 2019-01-02 2019-04-24         3
3 2019-06-02 2019-12-06         6

< या <= का चुनाव आपके उद्देश्य पर निर्भर करता है।

dt1 और dt2 के बीच कुल दिन प्राप्त करने के लिए,

df %>%
  rowwise() %>%
  mutate(val_count = length(x[dt1 < x & x < dt2])) %>%
  mutate(dd = as.Date(dt2) - as.Date(dt1))

  dt1        dt2        val_count dd      
  <chr>      <chr>          <int> <drtn>  
1 2019-05-02 2019-08-30         3 120 days
2 2019-01-02 2019-04-24         3 112 days
3 2019-06-02 2019-12-06         6 187 days

जोड़ें

df %>%
  rowwise() %>%
  mutate(val_count = length(x[dt1 < x & x < dt2]),
         val_count = ifelse(val_count == 0, 1, val_count)) %>%
  mutate(dd = as.Date(dt2) - as.Date(dt1))

  dt1        dt2        val_count dd      
  <chr>      <chr>          <dbl> <drtn>  
1 2019-05-02 2019-08-30         3 120 days
2 2019-01-02 2019-04-24         3 112 days
3 2019-06-02 2019-12-06         6 187 days
4 2019-06-01 2019-06-02         1   1 days
4
Park 25 नवम्बर 2021, 11:26
अच्छे समाधान के लिए धन्यवाद, आपका कोड अच्छी तरह से काम करता है। मुझे आश्चर्य है कि क्या इस मामले के लिए त्वरित सुधार जोड़ना संभव है जब दिनांक 2019-06-02 और 2019-06-03 के बीच शून्य आउटपुट से बचने के लिए हो?
 – 
Vendetta
25 नवम्बर 2021, 11:15
मुझे क्षमा करें। मैं समझ नहीं पा रहा हूं कि आप क्या चाहते हैं... क्या आप इसके बारे में और बताएंगे?
 – 
Park
25 नवम्बर 2021, 11:18
उदाहरण के लिए, इस डेटा df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02", "2019-06-01"), dt2 = c("2019-08-30", "2019-04-24", "2019-12-06", "2019-06-02") ) के साथ, मुझे अंतिम पंक्ति val_count शून्य के रूप में मिलती है। मैं 1 आउटपुट करना चाहता हूं और शून्य नहीं।
 – 
Vendetta
25 नवम्बर 2021, 11:25
मैं उपरोक्त कोड जोड़ता हूं। कृपया यह देखें।
 – 
Park
25 नवम्बर 2021, 11:27

उपर्युक्त समाधान वास्तव में थोड़े गन्दा है, ऐसा करने के लिए बस एक साधारण ऑनलाइनर लेता है

df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02", "2019-06-01"), dt2 =   c("2019-08-30", "2019-04-24", "2019-12-06", "2019-06-02") )

df %>%
  mutate(val_count = as.period(ymd(dt2) - ymd(dt1)) %/% months(1))

#          dt1        dt2 val_count
# 1 2019-05-02 2019-08-30         3
# 2 2019-01-02 2019-04-24         3
# 3 2019-06-02 2019-12-06         6
# 4 2019-06-01 2019-06-02         0
0
Merijn van Tilborg 25 नवम्बर 2021, 11:46