2014-02-08 61 views
38

我想開始使用dplyr來代替ddply,但是我無法獲得它如何工作的句柄(我已閱讀文檔)。當使用group_by(多個變量)時dplyr問題

例如,爲什麼當我嘗試mutate()時,「group_by」函數不工作,因爲它應該是?

看着mtcars:

庫(車)

說我做一個data.frame是mtcars的總結,通過 「共青團」 和 「齒輪」 分組:

df1 <- mtcars %.% 
      group_by(cyl, gear) %.% 
      summarise(
       newvar = sum(wt) 
      ) 

然後說我想進一步總結這個數據框。隨着ddply,它會是簡單的,但是當我試圖用dplyr做的,它實際上不是「分組依據」:

df2 <- df1 %.% 
      group_by(cyl) %.% 
      mutate(
       newvar2 = newvar + 5 
      ) 

仍產生未分組輸出:

cyl gear newvar newvar2 
1 6 3 6.675 11.675 
2 4 4 19.025 24.025 
3 6 4 12.375 17.375 
4 6 5 2.770 7.770 
5 4 3 2.465 7.465 
6 8 3 49.249 54.249 
7 4 5 3.653 8.653 
8 8 5 6.740 11.740 

我做語法錯了嗎?


編輯:

如果我是用plyr和ddply做到這一點:

df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt)) 

,然後獲得第二個DF:

df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5) 

但是,同樣的方法,總結()函數中sum(newvar)+ 5與dplyr不起作用...

+1

您能給我們與'ddply'等價的'plyr'代碼嗎? – dickoa

+0

你是什麼意思「未分組」?你在哪裏期待每組一行?或者你期望來自同一個組的所有行在彼此之下? – flodel

+0

我期望第二個df只有三行(每個cyl有一行),因爲它看起來像我剛剛在編輯中添加的ddply參數...我認爲這只是在某處添加一個參數的問題錯過了? –

回答

33

以Dickoa的回答了一步 - - 正如哈德利所說的「總結剝離一個單一的分組層次」。它剝離從你應用,所以你可以只使用

mtcars %>% 
group_by(cyl, gear) %>% 
summarise(newvar = sum(wt)) %>% 
summarise(newvar2 = sum(newvar) + 5) 

請注意,如果在第二行使用group_by(gear, cyl)這會給出一個不同的答案相反的順序分組。

而且讓你的第一次嘗試的工作:

df1 <- mtcars %>% 
group_by(cyl, gear) %>% 
summarise(newvar = sum(wt)) 

df2 <- df1 %>% 
group_by(cyl) %>% 
summarise(newvar2 = sum(newvar)+5) 
+10

我還想獲得有關哈德利「剝離」隱喻的更好信息。有沒有人有關於它的一些參考或其他公佈的答案? –

+0

https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html,請參閱包含以下短語的部分:「每個摘要剝離分組的一個級別」 – Alex

4

dplyr正如您在示例中所期望的那樣工作。按照您的指定,mutate只會爲newvar的每個值添加5,因爲它會創建newvar2。如果你分組或不分組,這看起來是一樣的。但是,如果你指定了一些不同的組,你將會得到不同的結果。例如:

df1 %.% 
      group_by(cyl) %.% 
      mutate(
       newvar2 = newvar + mean(cyl) 
      ) 
9

如果使用的summarise代替mutate你得到相同的結果您翻譯plyr代碼爲dplyr

library(plyr) 
df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt)) 
df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5) 
df2 
## cyl newvar2 
## 1 4 30.143 
## 2 6 26.820 
## 3 8 60.989 

detach(package:plyr)  
library(dplyr) 
mtcars %.% 
    group_by(cyl, gear) %.% 
    summarise(newvar = sum(wt)) %.% 
    group_by(cyl) %.% 
    summarise(newvar2 = sum(newvar) + 5) 
## cyl newvar2 
## 1 4 30.143 
## 2 8 60.989 
## 3 6 26.820 

編輯

由於summarise滴在最後一組(gear),你可以跳過第二個group_by(見下文@hadley評論)

library(dplyr) 
mtcars %.% 
    group_by(cyl, gear) %.% 
    summarise(newvar = sum(wt)) %.% 
    summarise(newvar2 = sum(newvar) + 5) 
## cyl newvar2 
## 1 4 30.143 
## 2 8 60.989 
## 3 6 26.820 
+0

因此,第二個「group_by()」和「summarize()」調用會覆蓋第一個? –

+1

是的,你也可以使用'regroup'來強制執行。 – dickoa

+2

您不需要第二個'group_by()',因爲彙總會自動刪除最後一個組(它摺疊的組)。 – hadley

56

我也有類似的問題。我發現根本脫離plyr解決它:

detach(package:plyr)  
library(dplyr) 
+8

坐在這裏拉我的頭髮爲最後一個半小時試圖理解爲什麼dplyr只是無視我的分組。很高興知道我不只是瘋了。 –

+4

我找不到爲什麼代碼一旦使用'summarize'運行良好,但沒有在稍後訪問它。的確,我在加載'dplyr'後添加了'plyr'。這就是爲什麼。不知道這是否是最近的加入,但我最近在加載兩者時遇到了這種情況:「您在dplyr之後加載了plyr - 這可能會導致問題。如果你需要plyr和dplyr的函數,請先載入plyr,然後dplyr:library(plyr);庫(dplyr)'。 – Hendy

+0

這是一個非常關鍵的問題..我瘋了。謝謝 – KS89

5

卸下plyr是要解決的問題,所以你可以,如果你需要從plyr等功能完成的其他任務使用根據需要dplyr功能...但單程你的代碼?

(在這個例子中,我有兩個裝和dplyrplyr

假設我們有一個簡單的data.frame,我們希望在不同的級別進行分組來計算變量value,的總和的GroupWise的gname

> dx<-data.frame(gname=c(1,1,1,2,2,2,3,3,3), value = c(2,2,2,4,4,4,5,6,7)) 
> dx 
    gname value 
1  1  2 
2  1  2 
3  1  2 
4  2  4 
5  2  4 
6  2  4 
7  3  5 
8  3  6 
9  3  7 

但是,當我們試圖用我們相信這將產生一個dplyr分組總和,這裏發生了什麼:

dx %>% group_by(gname) %>% mutate(mysum=sum(value)) 
Source: local data frame [9 x 3] 
Groups: gname 

    gname value mysum 
1  1  2 36 
2  1  2 36 
3  1  2 36 
4  2  4 36 
5  2  4 36 
6  2  4 36 
7  3  5 36 
8  3  6 36 
9  3  7 36 

它沒有給我們想要的答案。可能是因爲dplyrplyr之間group_by和/或mutate函數的某些交互或超載。我們可以分離plyr,但另一種方法是給一個獨特的調用dplyr版本group_bymutate

dx %>% dplyr::group_by(gname) %>% dplyr::mutate(mysum=sum(value)) 
Source: local data frame [9 x 3] 
Groups: gname 

    gname value mysum 
1  1  2  6 
2  1  2  6 
3  1  2  6 
4  2  4 12 
5  2  4 12 
6  2  4 12 
7  3  5 18 
8  3  6 18 
9  3  7 18 

現在我們看到這個按預期工作。

相關問題