2017-04-13 14 views
5

kullanarak her gruptaki satır ekle: ÇalışırBirlikte <code>ìris</code> veri kümesine yeni bir satır eklerseniz dplyr ve 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 

. Eğer bir gruplandırılmış operasyonu kullanmak istiyorsanız JasonWang yaptığı açıklamada anlatıldığı gibi

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

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

'tibble' sürümünüzü yükseltin, bu hata iletisi en az üç aydır (https://github.com/tidyverse/tibble/blame/b32c2b952afdeff93d422512a132ec6d0a2e2fbc/R/add.R#L35-L37). (Yeni hata mesajı, "neden çalışmadığı sorusuna cevap veren gruplandırılmış veri karelerine satır ekleyemez", diyor.) – r2evans

+5

Her gruba satır eklemek için 'do' kullanabilirsiniz:' iris%>% group_by (Tür)%>% do (add_row (., .before = 0)) '. – JasonWang

+0

Teşekkürler JasonWang ve r2evans. Paketlerimi güncelledim ve do() kullanarak hile yapar. – Dan

cevap

3

, sen gibi diğer işlevleri olarak, do gerekir: Peki, neden her "alt küme" üstüne yeni bir satır ekleyin olamaz mutate veya summarise, gruplandırılmış veri çerçevesiyle (sizin durumunuzda, 50) veya bir satırda (örn. Özetlerken) aynı sayıda satır içeren bir sonuç bekler.

Muhtemelen bildiğiniz gibi, genel olarak do yavaş olabilir ve sonucunuzu başka bir şekilde gerçekleştiremezseniz son çare olmalıdır. Göreviniz oldukça basittir, çünkü sadece veri çerçevenize ekstra satır eklemeyi içerir, örneğin basit indeksleme, örn. iris[NA, ] çıktısına bakın. istediğiniz ne

bir vektör

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

oluşturmak için esas olarak (birinci grup satır 1 ila 50 içinde olduğu, 51 ila 100 ikinci bir ve 150 101 üçüncü bir). Bu değer iris[indices, ] olur.

Bu vektörün daha genel bir yolu group_indices kullanır.

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

( map Sana tidyverse ile bu etiketledi olarak yüklediğiniz varsayalım purrr gelir).

+1

Vay. @konvas tam cevap için teşekkürler. FYI, hayır bilmiyorum, yavaş ve purrr/map ile alternatifin farkında değildi. SO'yu harika yapan budur. Şimdi bu sorunun cevabını nereye arayacağımı biliyorum. Teşekkürler – Dan