2017-09-25 37 views
5

मेरे पास एक बाइक के प्रक्षेपण का एक नमूना डेटासेट है। मेरे उद्देश्य, यह पता लगाने की औसत पर है, समय की राशि है कि स्टेशन का दौरा करने के बी के बीच में खामियोंअगले होने वाले रिकॉर्ड का सूचकांक

अब तक, मैं कर पाए हैं बस के साथ डाटासेट ऑर्डर करने के लिए:

test[order(test$starttime, decreasing = FALSE),] 

और पाते हैं जहां start_station और end_station बराबर बी

which(test$start_station == 'B') 
which(test$end_station == 'B') 

अगले भाग है, जहां मैं मुसीबत में पड़ की पंक्ति सूचकांक। आदेश समय की गणना करने के लिए कि खामियों जब बाइक स्टेशन बी में है के बीच में, हम जहां start_station = "B" (बाइक छोड़ देता है) के बीच difftime() और रिकॉर्ड होने वाली अगली जहां end_station= "B", भले ही रिकॉर्ड में होने वाला रखना चाहिए में एक ही पंक्ति (पंक्ति 6 ​​देखें)।

नीचे डाटासेट का उपयोग करना, हम जानते हैं कि बाइक 7:30:00 और स्टेशन बी, 18:00:00 के बीच 30 मिनट और स्टेशन बी के 18:30:00 बाहर, और 19:00:00 के बीच 210 मिनट और स्टेशन बी के 22:30:00 बाहर, के 16:00:00 बाहर के बीच 510 मिनट तक जो औसत 250 minutes.

difftime() का उपयोग करके आर में इस आउटपुट को पुन: पेश कैसे किया जाएगा?

> test 
    bikeid start_station   starttime end_station    endtime 
1  1    A 2017-09-25 01:00:00   B 2017-09-25 01:30:00 
2  1    B 2017-09-25 07:30:00   C 2017-09-25 08:00:00 
3  1    C 2017-09-25 10:00:00   A 2017-09-25 10:30:00 
4  1    A 2017-09-25 13:00:00   C 2017-09-25 13:30:00 
5  1    C 2017-09-25 15:30:00   B 2017-09-25 16:00:00 
6  1    B 2017-09-25 18:00:00   B 2017-09-25 18:30:00 
7  1    B 2017-09-25 19:00:00   A 2017-09-25 19:30:00 
8  1    А 2017-09-25 20:00:00   C 2017-09-25 20:30:00 
9  1    C 2017-09-25 22:00:00   B 2017-09-25 22:30:00 
10  1    B 2017-09-25 23:00:00   C 2017-09-25 23:30:00 

यहाँ नमूना डेटा है: के रूप में यह होता है क्रम में पूछा

> dput(test) 
structure(list(bikeid = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), start_station = c("A", 
"B", "C", "A", "C", "B", "B", "А", "C", "B"), starttime = structure(c(1506315600, 
1506339000, 1506348000, 1506358800, 1506367800, 1506376800, 1506380400, 
1506384000, 1506391200, 1506394800), class = c("POSIXct", "POSIXt" 
), tzone = ""), end_station = c("B", "C", "A", "C", "B", "B", 
"A", "C", "B", "C"), endtime = structure(c(1506317400, 1506340800, 
1506349800, 1506360600, 1506369600, 1506378600, 1506382200, 1506385800, 
1506393000, 1506396600), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("bikeid", 
"start_station", "starttime", "end_station", "endtime"), row.names = c(NA, 
-10L), class = "data.frame") 
+2

पहला चरण 'लाइब्रेरी (डेटा.table) जैसे कुछ प्रारूप में बदल जाएगा; mtest = पिघल (setDT (परीक्षण), आईडी = "बाइकिड", माप = पैटर्न ("_ स्टेशन", "समय"), variable.name = "घटना", value.name = c ("स्टेशन", "समय")); mtest [। (कारक (1: 2), सी ("प्रारंभ", "अंत")), =। (घटना), घटना: = i.V2]; सेटकी (mtest, बाइकिड, समय) ', लेकिन मुझे यकीन नहीं है कि उसके बाद सबसे अच्छा तरीका है। – Frank

उत्तर

1

यह अंतर की गणना करेगा, लेकिन data.frame

lapply(df1$starttime[df1$start_station == "B"], function(x, et) difftime(et[x < et][1], x, units = "mins"), et = df1$endtime[df1$end_station == "B"]) 

[[1]] 
Time difference of 510 mins 

[[2]] 
Time difference of 30 mins 

[[3]] 
Time difference of 210 mins 

[[4]] 
Time difference of NA mins 

से संलग्न नहीं है की गणना करने के औसत समय:

v1 <- sapply(df1$starttime[df1$start_station == "B"], function(x, et) difftime(et[x < et][1], x, units = "mins"), et = df1$endtime[df1$end_station == "B"]) 
mean(v1, na.rm = TRUE) 

[1] 250 
+0

धन्यवाद, यह विधि काम करता है। क्या आप संक्षिप्त रूप से व्याख्या कर सकते हैं कि 'फ़ंक्शन (x, et)' कैसे काम करता है? –

+0

'lapply' फ़ंक्शन पर एकाधिक तर्क पारित करने की अनुमति देता है। 'X' के लिए मान 'स्टार्टटाइम' है जबकि 'et' फ़ंक्शन के बाद परिभाषित अतिरिक्त पैरामीटर है। ऐसा इसलिए है कि पैरामीटर केवल एक बार परिभाषित किया गया है, लेकिन फ़ंक्शन में दो बार उपयोग किया जा सकता है। – manotheshark

1

एक और संभावना:

library(data.table) 
d <- setDT(test)[ , { 
    start = starttime[start_station == "B"] 
    end = endtime[end_station == "B"] 
    .(start = start, end = end, duration = difftime(end, start, units = "min")) 
} 
, by = .(trip = cumsum(start_station == "B"))] 
d 
# trip    start     end duration 
# 1: 0    <NA> 2017-09-25 01:30:00 NA mins 
# 2: 1 2017-09-25 07:30:00 2017-09-25 16:00:00 510 mins 
# 3: 2 2017-09-25 18:00:00 2017-09-25 18:30:00 30 mins 
# 4: 3 2017-09-25 19:00:00 2017-09-25 22:30:00 210 mins 
# 5: 4 2017-09-25 23:00:00    <NA> NA mins 


d[ , mean(duration, na.rm = TRUE)] 
# Time difference of 250 mins 

# or 
d[ , mean(as.integer(duration), na.rm = TRUE)] 
# [1] 250 

डेटा एक काउंटर जो 1 से हर बार एक मोटर साइकिल की 'बी' (by = cumsum(start_station == "B")) से शुरू होता है बढ़ जाती है के आधार पर वर्गीकृत किया जाता है।

संबंधित मुद्दे