2015-10-13 19 views
5

देता है मैं अपनी प्रयोगशाला में किसी निश्चित मानदंड के लिए पास दरों की गणना करने के लिए फ़ंक्शन को सत्यापित करने पर काम कर रहा हूं। इसके पीछे गणित बहुत ही सरल है: कई परीक्षणों को देखते हुए जो या तो पास हो गए या असफल रहे, किस प्रतिशत ने पारित किया।dplyr :: mutate x/y = NA देता है, संक्षेप में x/y = वास्तविक संख्या

डेटा मान हैं कि के एक स्तंभ के रूप में प्रदान किया जाएगा या तो P1 (पहला परीक्षण को पारित कर दिया), F1 (पहला परीक्षण पर विफल), P2 या F2 (पारित कर दिया या दूसरे टेस्ट में असफल रहा, क्रमशः)। मैंने कुल दर (पहली और दूसरी कोशिश) और पहले परीक्षण और अलगाव में दूसरे परीक्षण की गणना करने में सहायता के लिए नीचे passRate फ़ंक्शन लिखा था।

गुणवत्ता विशेषज्ञ जिन्होंने सत्यापन के लिए पैरामीटर सेट अप किए हैं, मुझे पास की असफलता और असफल गणना मिली है जो मैं test_vector फ़ंक्शन का उपयोग करके वेक्टर में परिवर्तित कर रहा हूं।

सब कुछ अच्छा लग रहा था जब तक कि मैं Pass डेटा फ्रेम की तीसरी पंक्ति तक नहीं पहुंच पाया, जिसमें मेरे गुणवत्ता विशेषज्ञ से पास/असफल गणना शामिल है। 100% की दूसरे टेस्ट पास दर लौटने की बजाय, यह लागू नहीं देता है ... लेकिन केवल जब मैं mutate

library(dplyr) 

Pass <- structure(list(P1 = c(2L, 0L, 10L), 
         F1 = c(0L, 2L, 0L), 
         P2 = c(0L, 3L, 2L), 
         F2 = c(0L, 2L, 0L), 
         id = 1:3), 
        .Names = c("P1", "F1", "P2", "F2", "id"), 
        class = c("tbl_df", "data.frame"), 
        row.names = c(NA, -3L)) 

तो यहाँ का उपयोग मैं mutate साथ क्या किया था के लिए कुछ समान है।

Pass %>% 
    group_by(id) %>% 
    mutate(pass_rate = (P1 + P2)/(P1 + P2 + F1 + F2) * 100, 
     pass_rate1 = P1/(P1 + F1) * 100, 
     pass_rate2 = P2/(P2 + F2) * 100) 

Source: local data frame [3 x 8] 
Groups: id [3] 

    P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2 
    (int) (int) (int) (int) (int)  (dbl)  (dbl)  (dbl) 
1  2  0  0  0  1 100.00000  100   NA 
2  0  2  3  2  2 42.85714   0   60 
3 10  0  3  1  3 100.00000  100   NA 

जब मैं का उपयोग summarise

Pass %>% 
    group_by(id) %>% 
    summarise(pass_rate = (P1 + P2)/(P1 + P2 + F1 + F2) * 100, 
      pass_rate1 = P1/(P1 + F1) * 100, 
      pass_rate2 = P2/(P2 + F2) * 100) 

Source: local data frame [3 x 4] 

    id pass_rate pass_rate1 pass_rate2 
    (int)  (dbl)  (dbl)  (dbl) 
1  1 100.00000  100   NA 
2  2 42.85714   0   60 
3  3 100.00000  100  100 

मैं अपेक्षा की होगी ये वही परिणाम देने के की तुलना करें। मेरा अनुमान है कि mutate कहीं समस्याएं हैं क्योंकि यह मानता है कि n प्रति समूह पंक्तियों को परिणाम में n पंक्तियों पर नक्शा करना चाहिए (क्या यह n की गणना में भ्रमित हो रहा है?), जबकि summarise जानता है कि इससे कोई फर्क नहीं पड़ता कि यह कितनी पंक्तियां शुरू होती है, यह है केवल 1.

क्या किसी के पास इस विचार के पीछे यांत्रिकी क्या है इस पर कोई विचार है?

+3

यह वास्तव में एक ठोस उदाहरण है। क्या आपके पास एक आसान तरीका है जो दिखाता है कि एक बग (आपके शीर्षक में) की तरह क्या लगता है? यहां सामान्य संदर्भ दिया गया है: [mcve] – Frank

+0

आप सही हैं, मैंने इसे कम करने की कोशिश करने में अधिक समय नहीं लगाया था। मैंने सभी अतिरिक्त कार्यों के बिना परिणामों की सीधे गणना करने के लिए कोड डाला है। – Benjamin

+4

एक बग की तरह लगता है: 'पास <- data.frame (पी 2 = सी (0,3,2), एफ 2 = सी (0,2,0), आईडी = 1: 3); पास%>% group_by (आईडी)%>% उत्परिवर्तन (पास 2 = पी 2/(पी 2 + एफ 2)) '। पंक्ति 3 – jeremycg

उत्तर

3

मुझे लगता है कि dplyr और plyr के बीच कुछ हस्तक्षेप की तरह मुझे लगता है। मेरे पास एक और असंतुलित डेटासेट (इसलिए समूह आवश्यक था) के साथ एक ही समस्या थी, जहां वास्तव में तीसरे समूह में उत्परिवर्तित चर गलत रूप से NA था! तब मैंने घर पर अपना उदाहरण दोहराया। सबसे पहले,

मुझे आपके परिणाम मिल गए। तब मैंने अपनी खुद की लिपि निष्पादित की, जहां पैकेज plyr लोड किया गया था। चेतावनी के बाद plyrdplyr के बाद लोड नहीं करना है, मेरे में एनए तीसरा समूह चला गया था और आपका उदाहरण सही ढंग से गणना की गई थी! यहाँ मैं क्या किया है (मैं अगर एनए तीसरे समूह में रहता है यह देखने के लिए एक और पंक्ति जोड़ा):

> Pass <- structure(list(P1 = c(2L, 0L, 10L,8L), 
+      F1 = c(0L, 2L, 0L, 4L), 
+      P2 = c(0L, 3L, 2L, 2L), 
+      F2 = c(0L, 2L, 0L, 1L), 
+      id = 1:4), 
+     .Names = c("P1", "F1", "P2", "F2", "id"), 
+     class = c("tbl_df", "data.frame"), 
+     row.names = c(NA, -4L)) 
> Pass %>% 
+  group_by(id) %>% 
+  mutate(pass_rate = (P1 + P2)/(P1 + P2 + F1 + F2) * 100, 
+   pass_rate1 = P1/(P1 + F1) * 100, 
+   pass_rate2 = P2/(P2 + F2) * 100) 
Source: local data frame [4 x 8] 
Groups: id [4] 

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2 
(int) (int) (int) (int) (int)  (dbl)  (dbl)  (dbl) 
1  2  0  0  0  1 100.00000 100.00000   NA 
2  0  2  3  2  2 42.85714 0.00000 60.00000 
3 10  0  2  0  3 100.00000 100.00000   NA 
4  8  4  2  1  4 66.66667 66.66667 66.66667 

तो मैंने किया:

> library("plyr", lib.loc="~/R/x86_64-pc-linux-gnu-library/3.2") 
> Pass %>% 
+  group_by(id) %>% 
+  mutate(pass_rate = (P1 + P2)/(P1 + P2 + F1 + F2) * 100, 
+   pass_rate1 = P1/(P1 + F1) * 100, 
+   pass_rate2 = P2/(P2 + F2) * 100) 
Source: local data frame [4 x 8] 
Groups: id [4] 

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2 
(int) (int) (int) (int) (int)  (dbl)  (dbl)  (dbl) 
1  2  0  0  0  1 100.00000 100.00000  NaN 
2  0  2  3  2  2 42.85714 0.00000 60.00000 
3 10  0  2  0  3 100.00000 100.00000 100.00000 
4  8  4  2  1  4 66.66667 66.66667 66.66667 

मुझे पता है कि यह एक संतोषजनक जवाब वजह से नहीं है plyrdplyr के बाद लोड किया जाना चाहिए, लेकिन शायद यह उन लोगों की सहायता करता है जिन्हें group_by(id) की आवश्यकता है। या plyr::mutate() का उपयोग करें।फिर plyr के बाद dplyr लोड कर सकते हैं:

> Pass %>% 
+  group_by(id) %>% 
+  plyr::mutate(pass_rate = (P1 + P2)/(P1 + P2 + F1 + F2) * 100, 
+   pass_rate1 = P1/(P1 + F1) * 100, 
+   pass_rate2 = P2/(P2 + F2) * 100) 
Source: local data frame [4 x 8] 
Groups: id [4] 

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2 
(int) (int) (int) (int) (int)  (dbl)  (dbl)  (dbl) 
1  2  0  0  0  1 100.00000 100.00000  NaN 
2  0  2  3  2  2 42.85714 0.00000 60.00000 
3 10  0  2  0  3 100.00000 100.00000 100.00000 
4  8  4  2  1  4 66.66667 66.66667 66.66667 
+0

ऐसा कुछ है जिसे मैंने कभी नहीं सोचा होगा। आकर्षक दुष्प्रभाव। – Benjamin

+0

मुझे लगता है कि यह ज्यादातर 'group_by'' plyr' लोड करने के बाद काम नहीं कर रहा है। – jeremycg

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