2017-04-13 5 views
5

का उपयोग कर प्रत्येक समूह में पंक्ति जोड़ें:मैं साथ <code>ìris</code> डाटासेट करने के लिए एक नई पंक्ति जोड़ने तो dplyr और add_row()

iris <- as_tibble(iris) 

> iris %>% 
    add_row(.before=0) 

# A tibble: 151 × 5 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
      <dbl>  <dbl>  <dbl>  <dbl> <chr> 
1   NA   NA   NA   NA <NA> <--- Good! 
2   5.1   3.5   1.4   0.2 setosa 
3   4.9   3.0   1.4   0.2 setosa 

यह काम करता है।

iris %>% 
group_by(Species) %>% 
add_row(.before=0) 

Error: is.data.frame(df) is not TRUE 
+1

'tibble' का आपका संस्करण अपग्रेड, कि त्रुटि संदेश कम से कम [तीन महीने] है (https://github.com/tidyverse/tibble/blame/b32c2b952afdeff93d422512a132ec6d0a2e2fbc/R/add.R#L35-L37)। (नया त्रुटि संदेश कहता है, "समूहित डेटा फ्रेम में पंक्तियां नहीं जोड़ सकते हैं", जो आपके प्रश्न का उत्तर देता है कि यह क्यों काम नहीं कर रहा है।) – r2evans

+5

आप प्रत्येक समूह में पंक्ति जोड़ने के लिए 'do' का उपयोग कर सकते हैं:' iris%>% group_by (प्रजातियां)%>% करते हैं (add_row (।, .before = 0)) '। – JasonWang

+0

धन्यवाद जेसनवांग और आर 2 एवांस। मैंने अपने पैकेज अपडेट किए हैं और डू() चाल का उपयोग कर रहा है। – Dan

उत्तर

3

आप एक वर्गीकृत किया आपरेशन का उपयोग करना चाहते हैं, तो आप do जरूरत JasonWang की तरह अपने टिप्पणी में वर्णित है, जैसे अन्य कार्यों के रूप में: तो, क्यों मैं के साथ एक "सबसेट" की चोटी पर एक नई पंक्ति जोड़ना नहीं कर सकते mutate या summarise समूह की डेटा फ्रेम (आपके मामले में, 50) या एक पंक्ति के साथ पंक्तियों की समान संख्या के साथ परिणाम की अपेक्षा करता है (उदाहरण के लिए संक्षेप में)।

जैसा कि आप शायद जानते हैं, सामान्य do धीमा हो सकता है और यदि आप अपना परिणाम किसी अन्य तरीके से प्राप्त नहीं कर सकते हैं तो अंतिम उपाय होना चाहिए। आपका कार्य काफी सरल है क्योंकि इसमें केवल आपके डेटा फ्रेम में अतिरिक्त पंक्तियां शामिल करना शामिल है, जो सरल अनुक्रमण द्वारा किया जा सकता है, उदा। iris[NA, ] के आउटपुट को देखें।

तुम क्या चाहते एक वेक्टर

indices <- c(NA, 1:50, NA, 51:100, NA, 101:150) 

बनाने के लिए अनिवार्य रूप से है (के बाद से पहले समूह 1 से 50 पंक्तियों में है, 51 से 100 में दूसरा एक और 150 के लिए 101 तीसरे एक)।

परिणाम iris[indices, ] है।

इस वेक्टर के निर्माण का एक और सामान्य तरीका group_indices का उपयोग करता है।

indices <- seq(nrow(iris)) %>% 
    split(group_indices(iris, Species)) %>% 
    map(~c(NA, .x)) %>% 
    unlist 

(mappurrr जो मुझे लगता है आप भरी हुई है के रूप में आप tidyverse के साथ इस टैग किया है से आता है)।

+1

वाह। पूरी तरह से जवाब @ konvas के लिए धन्यवाद। एफवाईआई, नहीं, मुझे नहीं पता था कि धीमा है और purrr/map के विकल्प के बारे में पता नहीं था। यह इतना अच्छा बनाता है। अब मुझे पता है कि इस समस्या के जवाब कहां देखना है। धन्यवाद – Dan

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