आशा है कि कोई मुझे मेरी विशिष्ट समस्या के समाधान की दिशा में इंगित कर सकता है।

मान लीजिए मेरे पास एक डेटा फ्रेम है, कॉलम ए में मेरे पास प्रारूप की तिथियां हैं (YYYY-MM-DD, POSIXct), जो कुछ प्रारंभ और समाप्ति बिंदु (यानी 2017/01/01 से 2018/01/01) के बीच हैं। कॉलम बीआई में आइटम्स की एक सूची है, और कॉलम सीआई में ए में दी गई तारीख पर एक आइटम की मात्रा है। इसके अतिरिक्त, मैं यह धारणा जोड़ना चाहता हूं कि हालांकि कॉलम ए में तिथियां ज्ञात प्रारंभ और समाप्ति तिथि के बीच चलती हैं। , और क्रम में हैं, जरूरी नहीं कि वे समान समय अंतराल से अलग हों। एक उदाहरण इस तरह दिख सकता है:

+------------+-------+----------+
|    Date    | Item  | Quantity |
+------------+-------+----------+
| 2017/01/01 | Beans |        2 |
| 2017/01/01 | Pens  |        4 |
| 2017/01/04 | Beans |        3 |
| 2017/01/04 | Pens  |        5 |
| 2017/02/01 | Tubes |        4 |
| 2017/02/03 | Beans |        9 |
+------------+-------+----------+

मैं जो करना चाहता हूं वह एक कॉलम जोड़ना है जो कॉलम ए में प्रत्येक तिथि को सकारात्मक पूर्णांक में बदल देता है जो किसी दिए गए प्रारंभ तिथि से दिनों की संख्या से मेल खाता है। उदाहरण के लिए, यदि प्रारंभ तिथि 2017/01/01 है, तो मैं निम्नलिखित कॉलम जोड़ना चाहता हूं

+------------+-------+----------+------+
|    Date    | Item  | Quantity | Days |
+------------+-------+----------+------+
| 2017/01/01 | Beans |        2 |    1 |
| 2017/01/01 | Pens  |        4 |    1 |
| 2017/01/04 | Beans |        3 |    4 |
| 2017/01/04 | Pens  |        5 |    4 |
| 2017/01/08 | Tubes |        4 |    8 |
| 2017/01/09 | Beans |        9 |    9 |
+------------+-------+----------+------+

क्या कोई आसान समाधान है जो आर की आंतरिक तिथि/समय प्रबंधन का उपयोग करता है (विशेष रूप से महीने/छुट्टियों आदि में दिनों की संख्या ...)

यहाँ dput() टिप्पणीकार द्वारा अनुरोध किया गया है

structure(list(date = structure(c(17167, 17167, 17170, 17170, 17174, 
17175), class = "Date"), item = structure(c(1L, 2L, 1L, 2L, 3L, 1L), 
.Label = c("Beans", "Pens", "Tubes"), class = "factor"), quantity = 
c(2, 4, 3, 5, 4, 9)), class = "data.frame", row.names = c(NA, -6L))

आपकी मदद के लिए अग्रिम धन्यवाद, मुझे आशा है कि मेरा प्रश्न समझ में आता है।

2
user9690527 3 जुलाई 2018, 00:20

3 जवाब

सबसे बढ़िया उत्तर
# Example data (please make it reproducible like this in future questions):

yourdata <- 
  data.frame(Quantity = c(2,4,3,5,4,9),
             Item = c('Beans', 'Pens', 'Beans', 'Pens', 'Tubes', 'Beans'),
             Date = c("2017/01/01", "2017/01/01","2017/01/04", "2017/01/04", '2017/01/01', "2017/01/09")
  )


yourdata$difftime <- sapply(yourdata$Date, difftime, yourdata$Date[1]) + 1
  Quantity  Item       Date difftime
1        2 Beans 2017/01/01        1
2        4  Pens 2017/01/01        1
3        3 Beans 2017/01/04        4
4        5  Pens 2017/01/04        4
5        4 Tubes 2017/01/08        8
6        9 Beans 2017/01/09        9

यह आपके जोड़े गए dput() डेटा पर भी काम करता है:

yourdata <- structure(list(date = structure(c(17167, 17167, 17170, 17170, 17174, 
                                              17175), class = "Date"), item = structure(c(1L, 2L, 1L, 2L, 3L, 1L), 
                                                                                        .Label = c("Beans", "Pens", "Tubes"), class = "factor"), quantity = 
                             c(2, 4, 3, 5, 4, 9)), class = "data.frame", row.names = c(NA, -6L))

yourdata$difftime <- sapply(yourdata$date, difftime, yourdata$date[1]) + 1

yourdata
        date  item quantity difftime
1 2017-01-01 Beans        2        1
2 2017-01-01  Pens        4        1
3 2017-01-04 Beans        3        4
4 2017-01-04  Pens        5        4
5 2017-01-08 Tubes        4        8
6 2017-01-09 Beans        9        9
4
Hack-R 3 जुलाई 2018, 00:35

बस न्यूनतम घटाएं और 1 जोड़ें। यह पंक्ति क्रम आदि की परवाह किए बिना काम करेगा। यह मानता है कि आपका डेटा Date वर्ग का है (जैसा कि आपके dput में है)। अगर आपका डेटा POSIXct क्लास का है, तो मेरा सुझाव है कि इसे पहले Date क्लास के लिए ज़बरदस्ती करें, नहीं तो सेकंड में अंतर आ जाएगा। आपके डेटा को कॉल करना dd:

dd$days = as.integer(dd$date - min(dd$date)) + 1
dd
#         date  item quantity days
# 1 2017-01-01 Beans        2    1
# 2 2017-01-01  Pens        4    1
# 3 2017-01-04 Beans        3    4
# 4 2017-01-04  Pens        5    4
# 5 2017-01-08 Tubes        4    8
# 6 2017-01-09 Beans        9    9
2
Gregor Thomas 3 जुलाई 2018, 01:23
transform(dat,dif=as.numeric(difftime(date,date[1],units = "days")+1))

        date  item quantity dif
1 2017-01-01 Beans        2   1
2 2017-01-01  Pens        4   1
3 2017-01-04 Beans        3   4
4 2017-01-04  Pens        5   4
5 2017-01-08 Tubes        4   8
6 2017-01-09 Beans        9   9
0
Onyambu 3 जुलाई 2018, 01:19