2015-06-11 9 views
5

मैं अपने डेटा के साथ समस्या में चल रहा है, जहां मैं ले जाना चाहते पहले मनाया ob प्रत्येक व्यक्ति id के लिए स्कोर score और घटाना है कि उस से पिछले मनाया scoreपहले का चयन करें डेटा मनाया जाता है और उपयोग मे बदलें

पहले अवलोकन शून्य से पिछले प्रेक्षण के लिए पूछ के साथ समस्या यह है कि कभी कभी पहले अवलोकन डेटा याद आ रही है है।

वहाँ वैसे भी, प्रत्येक व्यक्ति के लिए सबसे पहले देखे स्कोर के लिए पूछने के लिए इस प्रकार किसी भी लापता डेटा लंघन है?

मैंने अपनी समस्या का वर्णन करने के लिए नीचे डीएफ बनाया।

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20), 
        ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3), 
        score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4)) 

    id ob score 
1 5 1 NA 
2 5 2  2 
3 5 3  3 
4 5 4  4 
5 5 5  3 
6 12 1  7 
7 12 2  3 
8 12 3  4 
9 17 1  3 
10 17 2  4 
11 20 1 NA 
12 20 2  1 
13 20 3  4 

और क्या मैं चलाने के लिए आशा करता हूं कोड मुझे दे देंगे कि है ...

id ob score es 
1 5 1 NA -1 
2 5 2  2 -1 
3 5 3  3 -1 
4 5 4  4 -1 
5 5 5  3 -1 
6 12 1  7 3 
7 12 2  3 3 
8 12 3  4 3 
9 17 1  3 -1 
10 17 2  4 -1 
11 20 1 NA -3 
12 20 2  1 -3 
13 20 3  4 -3 

मैं dplyr से बाहर काम करने के लिए प्रयास कर रहा हूँ और मैं 'group_by' कमांड के उपयोग को समझते हैं, हालांकि, सुनिश्चित नहीं है कि केवल पहले देखे गए स्कोर 'चयन' कैसे करें और फिर es बनाने के लिए उत्परिवर्तित करें।

उत्तर

6

मैं का प्रयोग करेंगे first() और last() (दोनों dplyr समारोह) और na.omit() (डिफ़ॉल्ट आँकड़े पैकेज से।

सबसे पहले, मुझे यकीन है कि अपने स्कोर स्तंभ तार उचित एनए मूल्यों के साथ एक numberic स्तंभ (नहीं के रूप में था होगा अपने उदाहरण)

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20), 
     ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3), 
     score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4)) 

तो आप

library(dplyr) 
help %>% group_by(id) %>% arrange(ob) %>% 
    mutate(es=first(na.omit(score)-last(na.omit(score)))) 
+0

जब मैं अपने वास्तविक डेटा पर इस कोड को चलाने के लिए, मैं कोई त्रुटि मिलती है -> "त्रुटि: डॉन ' टी संख्या संख्यात्मक वस्तु के लिए डिफ़ॉल्ट उत्पन्न करने के बारे में नहीं पता "। चर संख्यात्मक हैं, और एनएएस की एक उचित संख्या है, उदा। कुछ आईडी के पास कुछ भी नहीं है लेकिन एनए और अन्य नहीं हैं। कोई विचार? – bpace

+0

यदि आपके पास NA मूल्यों के अलावा कुछ भी नहीं है, तो आप क्या वापस करना चाहते हैं? यह अच्छा होगा अगर आपका नमूना डेटा वांछित आउटपुट के साथ इस परिदृश्य को शामिल करता। – MrFlick

+0

सहमत हुए। तो समस्या में स्कोर के लिए 3 अलग-अलग चर होते हैं और प्रत्येक आईडी में तीन चरों में से एक के लिए स्कोर होता है। मुझे लगता है कि मैं सिर्फ प्रत्येक के लिए कोड चला सकता हूं, लेकिन यदि समूह_बी में आईडी के पास स्कोर के लिए कोई डेटा नहीं है, तो त्रुटि संदेश पॉप अप हो जाता है ... संभवतः क्योंकि na.omit सभी डेटा निकालता है और वहां घटाने के लिए कुछ भी नहीं है। – bpace

0

यह समाधान कर सकते हैं एक लिट है le वाचाल, केवल b/c यह सहायक कार्यों की एक जोड़ी पर निर्भर करता है FIRST और LAST:

# The position (indicator) of the first value that evaluates to TRUE. 
LAST <- function (x, none = NA) { 
    out <- FIRST(reverse(x), none = none) 
    if (identical(none, out)) { 
     return(none) 
    } 
    else { 
     return(length(x) - out + 1) 
    } 
} 
# The position (indicator) of the last value that evaluates to TRUE. 
FIRST <- function (x, none = NA) 
{ 
    x[is.na(x)] <- FALSE 
    if (any(x)) 
     return(which.max(x)) 
    else return(none) 
} 

# returns the difference between the first and last non-missing values 
diff2 <- function(x) 
    x[LAST(!is.na(x))] - x[FIRST(!is.na(x))] 


library(dplyr) 
help %>% 
    group_by(id) %>% 
    arrange(ob) %>% 
     summarise(diff = diff2(score)) 
1
library(dplyr) 

temp <- help %>% group_by(id) %>% 
    arrange(ob) %>% 
    filter(!is.na(score)) %>% 
    mutate(es = first(score) - last(score)) %>% 
    select(id, es) %>% 
    distinct() 

help %>% left_join(temp) 
संबंधित मुद्दे