2016-08-01 7 views
5

आर का उपयोग करके, मैं प्रत्येक व्यक्ति के लिए कुल समयावधि की गणना करने की कोशिश कर रहा हूं, जहां इस समय की अवधि कुछ सीमा से ऊपर बिताए गए समय है।एकाग्रता की कुल समयावधि की गणना कैसे करें, एक सीमा को कई बार पार करते हुए?

उदाहरण के लिए, नीचे की साजिश में मेरे पास 3 विषयों (आईडी) के लिए एकाग्रता डेटा है, और मैं प्रत्येक व्यक्ति के लिए नीली धराशायी रेखा से ऊपर का समय (एक्स अक्ष) खोजना चाहता हूं। डेटा सेट संरचना होगा कुछ की तरह:

head(dataset) 
    ID time  CP 
1 1 0.0 0.00000000 
2 1 0.0 0.00000000 
3 1 0.5 0.03759806 
4 1 1.0 0.12523455 
5 1 1.5 0.23483219 
6 1 2.0 0.34820905 

Solid lines represent the concentrations for 3 different subjects

मैं निम्नलिखित कोड का उपयोग करने की कोशिश की:

library(data.table) 
TAbove<-setDT(dataset)[CP > .05, diff(range(time)), by = ID] 

हालांकि, इस कोड है कि यह ऊपर पहले वृद्धि से समय अवधि की गणना करता है आखिरी बूंद पर धराशायी नीली रेखा। उदाहरण के लिए हरी रेखा आईडी के लिए, ब्लैक लाइन देखें।

enter image description here

मैं एक कोड है कि खाते में उन्हें बहिष्कृत करके बार जहां सांद्रता धराशायी रेखा से नीचे ड्रॉप लेता है, कैसे लिख सकते हैं। अंतिम परिणाम धराशायी नीली रेखा के ऊपर हर समय की कुल समय अवधि होगी। जैसे

नीचे

enter image description here

+0

'rle' देखें। पल के लिए एकाधिक आईडी को अनदेखा करते हुए, कहें, 'x = sin (seq (-3 * pi, 3 * pi, 0.1))' और कंप्यूटिंग 'r = rle (x> threshold)', प्रारंभिक और अंत स्थिति क्रमशः 'सत्य' (यानी 'x> थ्रेसहोल्ड') हैं 's = cumsum (सी (1, आर $ लंबाई)) [आर $ मान]' और 'ई = i + आर $ लंबाई [आर $ मूल्य] - क्रमशः 1'। सारांश 'समय [ई] - समय [ओं] 'को कुल समय देना चाहिए जहां' x> थ्रेसहोल्ड'। –

उत्तर

1

तो सवाल उठाने के विचार को प्रदान करने के लिए कण के लिए धन्यवाद। नीचे दिए गए कोड ने मुझे विश्लेषण करने में मदद की, हालांकि मुझे "दिन" नामक एक चर जोड़ना पड़ा, और उसके बाद प्रति दिन समय अवधि की गणना की गई। यहां मैंने दिन का उपयोग किया क्योंकि प्रति दिन एक अंतराल होता है। लेकिन आप इसे अपनी जरूरत के हिसाब से समायोजित कर सकते हैं।

#sub-setting by day 
dataset$Day[dataset$time>=0 &dataset$time<24] <- "Day 1" 
dataset$Day[dataset$time>=24 &dataset$time<48] <- "Day 2" 
dataset$Day[dataset$time>=48 &dataset$time<72] <- "Day 3" 
#per day# 
TAbove<-setDT(dataset)[CP > .05, diff((time)), by = .(ID,Day)] 
library(plyr) 
# sum the time duration for each day per person 
sumPerDay<-summarise(group_by(TAbove, ID,Day), 
      sum=sum(V1)) 
# sum the time duration for ALL days per person 
sumAll<-summarise(group_by(TAbove, ID), 
       sum=sum(V1)) 
2

मुझे लगता है कि अपने समाधान लगभग पूर्ण है, बस range को छोड़ दें। मैं एक विस्तारित डेटासेट पर निम्नलिखित की कोशिश की निम्नलिखित परिणाम के साथ

> dat <- fread("ID time  CP 
+    1 0.0 0.00000000 
+    1 0.0 0.00000000 
+    1 0.5 0.03759806 
+    1 1.0 0.12523455 
+    1 1.5 0.23483219 
+    1 2.0 0.34820905 
+    1 3.0 0.5 
+    2 0.0 0.5 
+    2 0.5 0.01 
+    2 1.0 0.2") 

(कुछ प्रविष्टियों जोड़ा):

> dat[CP > .05, diff(time), by = ID] 
    ID V1 
1: 1 0.5 
2: 1 0.5 
3: 1 1.0 
4: 2 1.0 

संपादित करें: मूल डेटा के साथ गणना सेट

मूल डेटा का उपयोग करना सेट

dataset <- fread("ID time  CP 
        1 0.0 0.00000000 
        1 0.0 0.00000000 
        1 0.5 0.03759806 
        1 1.0 0.12523455 
        1 1.5 0.23483219 
        1 2.0 0.34820905") 

हम वें प्राप्त करते हैं ई निम्नलिखित परिणाम:

> dataset[CP > .05, diff(time), by = ID] 
    ID V1 
1: 1 0.5 
2: 1 0.5 
+0

किसी कारण से, कोड मुझे अलग जवाब दे रहा है। आईडी V1 1: 1 0.5 2: 1 0.5 3: 1 0.5 4: 1 0.5

+0

हो सकता है कि आपके आर सत्र को पुन: प्रारंभ या के नवीनतम संस्करण में अद्यतन करने के 'data.table' मदद करता है।बस मेरे समाधान की दोबारा जांच की गई और यह मेरी मशीन पर आर, 'data.table' और एक नए आर सत्र के नवीनतम संस्करण के साथ काम करता है। – rhole

+0

क्षमा करें, कोशिश की लेकिन अभी भी मुझे अलग-अलग परिणाम दे रहे हैं। क्या आप कृपया इस्तेमाल किए गए कोड को लिख सकते हैं? –

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