2016-10-14 9 views
7

का उपयोग करके, समूह द्वारा पिछले या अगले मान के साथ NA को बदलें, मेरे पास डेटा फ्रेम है जो दिनांक के अवरोही क्रम द्वारा व्यवस्थित किया गया है।डीएपीआर

ps1 = data.frame(userID = c(21,21,21,22,22,22,23,23,23), 
      color = c(NA,'blue','red','blue',NA,NA,'red',NA,'gold'), 
      age = c('3yrs','2yrs',NA,NA,'3yrs',NA,NA,'4yrs',NA), 
      gender = c('F',NA,'M',NA,NA,'F','F',NA,'F') 
) 

मैं आरोपित करने के लिए (की जगह) NA पिछले मान और userID के आधार पर वर्गीकृत मामले के उपयोगकर्ता ID की पहली पंक्ति में एनए तो उस उपयोगकर्ता आईडी समूह के लिए मूल्यों के अगले सेट के साथ बदलें गया है के साथ महत्व देता कामना करते हैं।

मैं इस तरह dplyr और चिड़ियाघर संकुल कुछ का उपयोग करने की कोशिश कर रहा हूँ ... लेकिन इसके काम नहीं कर रहा

cleanedFUG <- filteredUserGroup %>% 
group_by(UserID) %>% 
mutate(Age1 = na.locf(Age), 
    Color1 = na.locf(Color), 
    Gender1 = na.locf(Gender)) 

मैं परिणाम की जरूरत df इस तरह:

     userID color age gender 
       1  21 blue 3yrs  F 
       2  21 blue 2yrs  F 
       3  21 red 2yrs  M 
       4  22 blue 3yrs  F 
       5  22 blue 3yrs  F 
       6  22 blue 3yrs  F 
       7  23 red 4yrs  F 
       8  23 red 4yrs  F 
       9  23 gold 4yrs  F 
+0

देखें अगर यह उपयोगी है। [नवीनतम गैर-एनए मूल्य के साथ एनएएस को बदलना] (http://stackoverflow.com/questions/7735647/replacing-nas-with-latest-non-na-value) या यह [समूह मूल्य के साथ NA मान को प्रतिस्थापित करें] (http : //stackoverflow.com/questions/23583739/replace-na-value-with-the-group-value) –

+0

@ ताराक हाय, अगर कोई जवाब आपकी समस्या हल करता है, तो इसे "स्वीकृत" चिह्नित करने में संकोच न करें, इसलिए अन्य लोग इसे भी देख सकते हैं ... धन्यवाद – agenis

उत्तर

17
require(tidyverse) #fill is part of tidyr 

ps1 %>% 
    group_by(userID) %>% 
    fill(color, age, gender) %>% #default direction down 
    fill(color, age, gender, .direction = "up") 

जो तुम देता है:

Source: local data frame [9 x 4] 
Groups: userID [3] 

    userID color age gender 
    <dbl> <fctr> <fctr> <fctr> 
1  21 blue 3yrs  F 
2  21 blue 2yrs  F 
3  21 red 2yrs  M 
4  22 blue 3yrs  F 
5  22 blue 3yrs  F 
6  22 blue 3yrs  F 
7  23 red 4yrs  F 
8  23 red 4yrs  F 
9  23 gold 4yrs  F 
1

सीधे zoo::na.locf का उपयोग करते हुए पूरे पर डेटा.फ्रेम userID समूहों के बावजूद NA को भर देगा। पैकेज dplyr के समूहीकरण na.locf समारोह पर दुर्भाग्य से कोई प्रभाव नहीं है, यही कारण है कि मैं एक विभाजन के साथ चला गया है:

library(dplyr); library(zoo) 
ps1 %>% split(ps1$userID) %>% 
    lapply(function(x) {na.locf(na.locf(x), fromLast=T)}) %>% 
    do.call(rbind, .) 
####  userID color age gender 
#### 21.1  21 blue 3yrs  F 
#### 21.2  21 blue 2yrs  F 
#### 21.3  21 red 2yrs  M 
#### 22.4  22 blue 3yrs  F 
#### 22.5  22 blue 3yrs  F 
#### 22.6  22 blue 3yrs  F 
#### 23.7  23 red 4yrs  F 
#### 23.8  23 red 4yrs  F 
#### 23.9  23 gold 4yrs  F 

क्या यह होता है कि यह पहली बार 3 data.frames में डेटा विभाजन है, तो मैं इलज़ाम का पहला पास लागू (नीचे की ओर), फिर lapply में अज्ञात फ़ंक्शन के साथ ऊपर, और अंत में डेटा.फ्रेम को एक साथ लाने के लिए rbind का उपयोग करें। आपके पास अपेक्षित आउटपुट है।

+1

आप 'scit (। $ userID)' –

+1

अन्य के साथ अधिक idiomatic 'bind_rows()' और 'split (ps1 $ userID)' के साथ 'do.call()' को प्रतिस्थापित कर सकते हैं। 'purrr' का उपयोग कर वैकल्पिक भी हो सकता है:' लाइब्रेरी (purrr); ps1%>% slice_rows ("userID")%>% by_slice (फ़ंक्शन (x) {na.locf (na.locf (x), सेलास्ट = टी)}, .collate = "पंक्तियां") ' –

+1

@ स्टीवन बीएप्रे अच्छा! जो अपने आप पर एक नया जवाब दे सकता है ;-) – agenis

1

purrr के साथ संयुक्त na.locf() साथ विधि @agenis का उपयोग करना, तुम कर सकते हो:

library(purrr) 
library(zoo) 

ps1 %>% 
    slice_rows("userID") %>% 
    by_slice(function(x) { 
    na.locf(na.locf(x), fromLast=T) }, 
    .collate = "rows")