2016-09-19 25 views
5

मैं आधार करता हूं कि मैं आर के साथ नया हूं और वास्तव में मैं मूलभूत सिद्धांतों को प्राप्त करने की कोशिश कर रहा हूं। वर्तमान में मैं एक बड़े डेटाफ्रेम (जिसे "पीपीएल" कहा जाता है) पर काम कर रहा हूं जिसे मुझे कुछ पंक्तियों को फ़िल्टर करने के लिए संपादित करना है। प्रत्येक पंक्ति को एक समूह में शामिल किया गया है और यह एक तीव्रता (इन) मान और नमूना मान द्वारा विशेषता है।आर लूप के लिए अधिकतम फ़ंक्शन लागू करने में विफल रहता है

 mz rt  into sample tracker  sn grp 
100.0153 126 2.762664  3 11908 7.522655 0 
100.0171 127 2.972048  2 5308 7.718521 0 
100.0788 272 30.217969  2 5309 19.024807 1 
100.0796 272 17.277916  3 11910 7.297716 1 
101.0042 128 37.557324  3 11916 27.991320 2 
101.0043 128 39.676014  2 5316 28.234918 2 

अच्छा, पहला सवाल यह है: "मैं उच्चतम तीव्रता वाले नमूने से प्रत्येक समूह से कैसे चयन कर सकता हूं?" मैं पाश के लिए एक करने की कोशिश की:

for (i in ppl$grp) { 
temp<-ppl[ppl$grp == i,] 
sel<-rbind(sel,temp[max(temp$into),]) 
} 

तथ्य यह है कि यह जीआरपी == 0 $ ppl के लिए काम करता है, लेकिन अगले चक्र NAS पंक्तियों को वापस। फिर फ़िल्टर किए गए डेटाफ्रेम (जिसे "सेल" कहा जाता है) को भी हटाए गए पंक्तियों के नमूना मानों को स्टोर करना चाहिए। यह इस प्रकार है के रूप में किया जाना चाहिए:

 mz rt  into sample tracker  sn grp 
100.0171 127 2.972048 c(2,3) 5308 7.718521 0 
100.0788 272 30.217969 c(2,3) 5309 19.024807 1 
101.0043 128 39.676014 c(2,3) 5316 28.234918 2 

आदेश में इस मैं इस दृष्टिकोण का प्रयोग करेंगे प्राप्त करने के लिए:

lev<-factor(ppl$grp) 
samp<-ppl$sample 
samp2<-split(samp,lev) 
sel$sample<-samp2 

किसी भी संकेत? क्योंकि मैं इसका परीक्षण नहीं कर सकता क्योंकि मैंने अभी भी पिछली समस्या का समाधान नहीं किया है।

बहुत बहुत धन्यवाद।

उत्तर

1

ave का उपयोग कर एक base R विकल्प

ppl[with(ppl, ave(into, grp, FUN = max)==into),] 

है उम्मीद उत्पादन में 'नमूना' कॉलम प्रत्येक में unique तत्वों है 'grp', फिर 'grp' द्वारा समूहबद्ध करने के बाद, ऊपर 'नमूना' को paste डी unique 'नमूना' के तत्वों के रूप में दिनांकित करें, फिर arrange 'इन' अवरोही और slice पहली पंक्ति के रूप में। जो ज्यादातर मामलों में कोई पूर्णांक नहीं प्रतीत होता है -

library(dplyr) 
ppl %>% 
    group_by(grp) %>% 
    mutate(sample = toString(sort(unique(sample)))) %>% 
    arrange(desc(into)) %>% 
    slice(1L) 
#  mz rt  into sample tracker  sn grp 
#  <dbl> <int>  <dbl> <chr> <int>  <dbl> <int> 
#1 100.0171 127 2.972048 2, 3 5308 7.718521  0 
#2 100.0788 272 30.217969 2, 3 5309 19.024807  1 
#3 101.0043 128 39.676014 2, 3 5316 28.234918  2 
2

सुनिश्चित नहीं है कि मैं आपके प्रश्न का पालन करता हूं। लेकिन शायद यह आपको शुरू कर देगा।

library(dplyr) 
ppl %>% group_by(grp) %>% filter(into == max(into)) 
0

एक data.table विकल्प:

library(data.table) 
setkey(setDT(ppl),grp) 
ppl <- ppl[ppl[,into==max(into),by=grp]$V1,] 
##   mz rt  into sample tracker  sn grp 
##1: 100.0171 127 2.972048  2 5308 7.718521 0 
##2: 100.0788 272 30.217969  2 5309 19.024807 1 
##3: 101.0043 128 39.676014  2 5316 28.234918 2 
0

मुझे पता नहीं क्यों इस कोड काम करेगा

for (i in ppl$grp) { 
    temp<-ppl[ppl$grp == i,] 
    sel<-rbind(sel,temp[max(temp$into),]) 
} 

अधिकतम (में अस्थायी $) अधिकतम मूल्य वापस चाहिए।

इसके अलावा, लूप इंस्टेंस के लिए प्रत्येक में rbind के साथ डेटा.फ्रेम बनाना अच्छा अभ्यास नहीं है (किसी भी भाषा में)। इसे थोड़ी-थोड़ी प्रकार की जांच और सरणी बढ़ने की आवश्यकता होती है जो बहुत महंगा हो सकती है।

इसके अलावा, उस समूह के लिए कोई एनएएस होने पर अधिकतम एनए वापस कर देगा।

संबंधों के बारे में आप क्या करना चाहते हैं इसके बारे में भी एक सवाल है? क्या आप सिर्फ एक परिणाम चाहते हैं या उन सभी को? कोड अक्रुन आपको उन सभी को देगा।

इस कोड को एक नया स्तंभ समूह अधिकतम

ppl$grpmax <- ave(ppl$into, ppl$grp, FUN=function(x) { max(x, na.rm=TRUE) }) 

तब आप उस

pplmax <- subset(ppl, into == grpmax) 

के साथ अधिकतम के बराबर हैं तो आप सिर्फ चाहते हैं किसी समूह के सभी मान चुन सकते हैं है कि लिखेंगे प्रति समूह एक तो आप डुप्लीकेट

pplmax[!duplicated(pplmax$grp),] 
हटा सकते हैं
संबंधित मुद्दे