2016-06-09 17 views
8

यह सीएसवी से मेरे डेटा का एक नमूना है। इसमें ~ 10 कॉलम हैं।पिछले घटना के साथ एनए बदलें

Product_id Product_Weight Product_Name Shop_Name ... 
[1] A    10    xxxx   Walmart 
[2] B    12    yyyy   Target 
[3] C    11    zzzz   Target 
[4] A    NA    xxxx   Walmart 
[5] C    NA    zzzz   Target 

मैं एनए की पंक्ति 4 और 5 में 10 और 11 के साथ क्रमश: भरने के लिए चाहते हैं (के बाद से ए और सी की उत्पाद वजन पहले से ही है और पंक्ति 1 से जाना जाता है 3)। मैं चाहता हूं कि अंतिम डेटा फ्रेम इस

Product_id Product_Weight Product_Name Shop_Name ... 
[1] A    10    xxxx   Walmart 
[2] B    12    yyyy   Target 
[3] C    11    zzzz   Target 
[4] A    10    xxxx   Walmart 
[5] C    11    zzzz   Target 

आर में ऐसा करने का सबसे अच्छा तरीका क्या है?

+0

क्या ये वजन हमेशा सेट होते हैं ताकि उत्पाद_आईडी - उत्पाद_नाम संयोजन वही वज़न लौटाए? – lmo

+0

@ एलएमओ हाँ वे हैं। – Avis

+0

एनए की जगह बदलने के बारे में एक और प्रश्नोत्तर: http://stackoverflow.com/questions/32694313/handle-continous-missing-values-in-time-series-data – Jaap

उत्तर

5

dplyr और tidyr साथ एक अन्य विकल्प:

library(dplyr); library(tidyr); 
df %>% group_by(Product_id) %>% fill(Product_Weight) 

Source: local data frame [5 x 4] 
Groups: Product_id [3] 

    Product_id Product_Weight Product_Name Shop_Name 
     (fctr)   (int)  (fctr) (fctr) 
1   A    10   xxxx Walmart 
2   A    10   xxxx Walmart 
3   B    12   yyyy Target 
4   C    11   zzzz Target 
5   C    11   zzzz Target 

परिणाम उत्पाद_आईडी द्वारा क्रमबद्ध किया गया है।

# create lookup table with item and weight combinations 
lookup<-unique(df[complete.cases(df[ ,1:2]),]) 

#  find the NAs needing replacement: which(is.na(df$weight)) 
#  find index in lookup tabe:match(df$a[which(is.na(df$weight)) 
#  subset: df$weight[which(is.na(df$weight)) 
df$weight[which(is.na(df$weight))]<-lookup$weight[match(df$Product_id[which(is.na(df$weight))], lookup$Product_id)] 

सबसे अधिक संभावना dplyr/tidyr समाधान जैसा कि ऊपर उल्लेख के रूप में कुशल नहीं:

+0

कैंट dplyr इसे बिना किसी रिकॉर्ड के कर सकता है? – rawr

9

हालांकि सवाल "पिछली आवृत्ति" के लिए कहा इस नुकसान यह है कि पहले Product_Weight किसी भी Product_id में NA तो यह भले ही हम बाद में एक Product_id से Product_Weight जानता था इसलिए बजाय का उपयोग करने में भरा नहीं कर सकता है कर रहे थे जा होता पिछली घटना हम सभी गैर-एनएएस का मतलब उसी Product_id के साथ लेते हैं। चूंकि ये सब एक जैसा होना चाहिए उनका मतलब उनका सामान्य मूल्य है।

तुम सच में पिछली आवृत्ति का उपयोग Prev समारोह चाहते हैं, तो जहां:

Prev <- function(x) na.locf(x, na.rm = FALSE) 

में na.aggregate के स्थान पर (1) और (3) और (2) का उपयोग नहीं करते।

निम्न समाधानों फायदे है कि वे सभी के लिए है:

  • इनपुट के क्रम बनाए रखने के

  • काम भले ही पहले Product_Weight किसी भी Product_id में एनए

  • नहीं है इनपुट

संशोधित करें

पहले समाधान में कोड की केवल एक पंक्ति होने के अतिरिक्त लाभ है (साथ ही library कथन) और दूसरे समाधान में किसी भी पैकेज का उपयोग न करने का अतिरिक्त लाभ है।

1) चिड़ियाघर :: na.aggregate हम चिड़ियाघर पैकेज (जो गैर NAS की औसत के साथ सभी NAS की जगह में na.aggregate का उपयोग करें) और हम एक Product_id के लिए अलग से Product_Weight करने के लिए इसे लागू होते हैं।

library(zoo) 
transform(DF, Product_Weight = ave(Product_Weight, Product_id, FUN = na.aggregate)) 

दे रही है:

Product_id Product_Weight Product_Name Shop_Name 
1   A    10   xxxx Walmart 
2   B    12   yyyy Target 
3   C    11   zzzz Target 
4   A    10   xxxx Walmart 
5   C    11   zzzz Target 

2) कोई पैकेज नहीं वैकल्पिक रूप से na.aggregate के स्थान पर Mean का उपयोग जहां Mean के रूप में परिभाषित किया गया है:

Mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)) 

3) dplyr/चिड़ियाघर जोड़ें पंक्ति संख्या, Product_id द्वारा समूह, भरें Mean नीचे या दिखाया गया है या तो na.aggregate का उपयोग कर से पहले समाधान के रूप में NAS, वापस मूल क्रम में व्यवस्था और पंक्ति संख्या निकालें:

library(dplyr) 
library(zoo) 

DF %>% 
    mutate(row = row_number()) %>% 
    group_by(Product_id) %>% 
    mutate(Product_Weight = na.aggregate(Product_Weight)) %>% 
    ungroup() %>% 
    arrange(row) %>% 
    select(-row) 

नोट:

Lines <- " Product_id Product_Weight Product_Name Shop_Name 
    A    10    xxxx   Walmart 
    B    12    yyyy   Target 
    C    11    zzzz   Target 
    A    NA    xxxx   Walmart 
    C    NA    zzzz   Target" 
DF <- read.table(text = Lines, header = TRUE) 
:
इस इनपुट DF के लिए इस्तेमाल किया गया था
2

यहाँ आधार आर आदेशों के साथ समाधान है।

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