2017-04-13 118 views
5

添加一行每組如果我添加一個新行ìris數據集:使用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 (物種)%>%do(add_row(。,.before = 0))'。 – JasonWang

+0

謝謝JasonWang和r2evans。我已經更新了我的軟件包,並使用do()來做到這一點。 – Dan

回答

3

如果你想使用組合操作,你需要像do在JasonWang他的評論中所述,像其他功能:那麼,我爲什麼不能在每一個「子集」與上面添加一個新行mutatesummarise預期的結果與分組數據幀(在您的情況下爲50)或一行(例如,彙總時)的行數相同。

正如你可能知道的一般,do可能會很慢,如果你不能以另一種方式實現你的結果應該是最後的手段。您的任務非常簡單,因爲它只涉及在數據框中添加額外的行,這可以通過簡單的索引來完成,例如,看看iris[NA, ]的輸出。

你想要的是基本上以創建矢量

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

(由於第一組是行1至50,第二個在51至100,第三個在101至150)。

結果是iris[indices, ]

構建此載體的更一般方式使用​​。

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

map來自purrr我假設你已經加載,你已經標記這與tidyverse)。

+1

哇。感謝徹底的回答@konvas。僅供參考,不,我不知道做得很慢,並沒有意識到嘌呤/地圖的替代方案。這是什麼讓偉大。現在我知道在哪裏尋找這個問題的答案。謝謝 – Dan