2014-05-13 6 views
5

मैं निम्नलिखित कार्य के साथ कुछ मदद की सराहना करता हूं: प्रत्येक डेटा के लिए नीचे दिए गए डेटा फ्रेम से (C), मैं अंतिम प्रविष्टि को कॉलम d_2 के तहत अंतिम प्रविष्टि घटा देना चाहता हूं प्रविष्टि और फिर परिणामों को एक ही आईडी युक्त एक और डेटाफ्रेम में स्टोर करें। मैं इसे अपने प्रारंभिक डेटा फ्रेम के साथ विलय कर सकता हूं। कृपया ध्यान दें कि इस क्रम में घटाव होना चाहिए (प्रत्येक id के लिए अंतिम प्रविष्टि शून्य पहली प्रविष्टि)।समूहित डेटा में पिछली प्रविष्टि से पहली प्रविष्टि को घटाएं

id <- c("A1", "A1", "B10","B10", "B500", "B500", "C100", "C100", "C100", "D40", "D40", "G100", "G100") 

d_1 <- c(rep(1.15, 2), rep(1.44, 2), rep(1.34, 2), rep(1.50, 3), rep(1.90, 2), rep(1.59, 2)) 

set.seed(2) 

d_2 <- round(runif(13, -1, 1), 2) 

C <- data.frame(id, d_1, d_2) 

id d_1 d_2 
A1 1.15 -0.63 
A1 1.15 0.40 
B10 1.44 0.15 
B10 1.44 -0.66 
B500 1.34 0.89 
B500 1.34 0.89 
C100 1.50 -0.74 
C100 1.50 0.67 
C100 1.50 -0.06 
D40 1.90 0.10 
D40 1.90 0.11 
G100 1.59 -0.52 
G100 1.59 0.52 

वांछित परिणाम:

id2 <- c("A1", "B10", "B500", "C100", "D40", "G100") 

difference <- c(1.03, -0.81, 0, 0.68, 0.01, 1.04) 

diff_df <- data.frame(id2, difference) 

id2 difference 
A1  1.03 
B10  -0.81 
B500  0.00 
C100  0.68 
D40  0.01 
G100  1.04 

मैं ddply का उपयोग कर पहली और आखिरी प्रविष्टियों प्राप्त करने के लिए द्वारा इस प्रयास किया, लेकिन मैं वास्तव में "समारोह का अनुक्रमण के साथ संघर्ष कर रहा हूँ

यहाँ कोड है वांछित परिणाम प्राप्त करने के लिए दूसरे कोड (नीचे) में तर्क "।

C_1 <- ddply(C, .(id), function(x) x[c(1, nrow(x)), ]) 

ddply(C_1, .(patient), function) 

ईमानदारी से कहूं तो मैं ddply साथ बहुत परिचित नहीं हूँ पैकेज-मैं कोड ऊपर एक और post से ढेर एक्सचेंज पर मिला है।

मेरे मूल डेटा एक groupedData है और मेरा मानना ​​है कि यह आ रहा का एक और तरीका gapply उपयोग कर रहा है, लेकिन फिर मैं यहाँ (आमतौर पर एक समारोह) तीसरा तर्क के साथ संघर्ष कर रहा हूँ

grouped_C <- groupedData(d_1 ~ d_2 | id, data = C, FUN = mean, labels = list(x = "", y = ""), units = list("")) 

x1 <- gapply(grouped_C, "d_2", first_entry) 

x2 <- gapply(grouped_C, "d_2", last_entry) 

जहां first_entry और last_entry कार्य हैं मुझे पहली और आखिरी प्रविष्टियां प्राप्त करने में मदद करने के लिए। मैं इसके साथ अंतर प्राप्त कर सकता हूं: x2 - x1। हालांकि, मुझे यकीन नहीं है कि उपरोक्त कोड (शायद सिर या पूंछ के साथ करने के लिए) में first_entry और last_entry के रूप में इनपुट करना क्या है?

किसी भी मदद की बहुत सराहना की जाएगी।

उत्तर

7

यह dplyr के साथ आसानी से किया जा सकता है। इस कार्य के लिए last और first फ़ंक्शंस बहुत उपयोगी हैं।

library(dplyr)    #install the package dplyr and load it into library 

diff_df <- C %>%    #create a new data.frame (diff_df) and store the output of the following operation in it. The %.% operator is used to chain several operations together but you dont have to reference the data.frame you are using each time. so here we are using your data.frame C for the following steps 
    group_by(id) %>%   #group the whole data.frame C by id 
    summarize(difference = last(d_2)-first(d_2))  #for each group of id, create a single line summary where the first entry of d_2 (for that group) is subtracted from the last entry of d_2 for that group 

# id difference    #this is the result stored in diff_df 
#1 A1  1.03 
#2 B10  -0.81 
#3 B500  0.00 
#4 C100  0.68 
#5 D40  0.01 
#6 G100  1.04 

टिप्पणी संपादित करें: %>%%.% के बजाय जो अब मान्य नहीं है के साथ अद्यतन पोस्ट।

+0

अपने जवाब के लिए धन्यवाद, बहुत सराहना। क्या आप सिंटैक्स और कोड के विभिन्न हिस्सों को समझाते हैं? आदि। यह मेरा पहला समय इस पैकेज का उपयोग कर रहा है। –

+1

@ जॉन निश्चित। मैंने अपने जवाब में परिचालनों की व्याख्या करने के लिए टिप्पणियां जोड़ दीं। 'Dplyr' पर अधिक जानकारी के लिए, पैकेज के लिए इस परिचय पर एक नज़र डालें (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html) –

+0

@ startneR-cool name रास्ते से! बहुत बहुत धन्यवाद, टिप्पणियां बहुत उपयोगी थीं लेकिन मैं दस्तावेज के माध्यम से भी जाऊंगा। धन्यवाद! –

0

यदि आपके पास कोई सिंगलेट है और उन्हें अकेले रहना होगा, तो यह आपकी समस्या का समाधान करेगा। यह docendo discimus के जवाब के रूप में ही है, लेकिन एक if-else घटक के साथ सिंगलटन मामलों से निपटने के:

library(dplyr)    
diff_df <- C %>%    
    group_by(id) %>% 
    summarize(difference = if(n() > 1) last(d_2) - first(d_2) else d_2) 
संबंधित मुद्दे