2015-03-31 29 views
0

在這個問題底部的data.frame中,我想按年份和年齡計算個人數量,創建年份減去年份的變量年齡,然後創建年齡和年級變量的因子版本。從base [R使用group_by()summarize()mutate()dplyrfactor()我得到以下結果:dplyr group_by後跟突變因子的意外行爲

d <- group_by(d,year,age) %>% summarize(catch=n()) 
d1 <- mutate(d,yrclass=year-age,fage=as.factor(age),fyrclass=as.factor(yrclass)) 
d1 

Source: local data frame [27 x 6] 
Groups: year 

    year age catch yrclass fage fyrclass 
1 2010 3 13 2007 3  2007 
2 2010 4 10 2006 4  2006 
3 2010 5 19 2005 5  2005 
4 2010 6 24 2004 6  2004 
5 2010 7 19 2003 7  2003 
6 2010 8 32 2002 8  2002 
7 2010 9 22 2001 9  2001 
8 2010 10 13 2000 10  2000 
9 2011 2  5 2009 3  NA 
10 2011 3  9 2008 4  NA 
.. ... ... ...  ... ...  ... 

人們可以在行9和10看到,「年齡」和「yrclass」的因子分解的版本不正確。但是,如果我從我的d data.frame中去除非data.frame類(即刪除dplyr相關的類),那麼這些錯誤消失。

d <- as.data.frame(d) 
d2 <- mutate(d,yrclass=year-age,fage=as.factor(age),fyrclass=as.factor(yrclass)) 
d2 # only first 10 rows shown 

    year age catch yrclass fage fyrclass 
1 2010 3 13 2007 3  2007 
2 2010 4 10 2006 4  2006 
3 2010 5 19 2005 5  2005 
4 2010 6 24 2004 6  2004 
5 2010 7 19 2003 7  2003 
6 2010 8 32 2002 8  2002 
7 2010 9 22 2001 9  2001 
8 2010 10 13 2000 10  2000 
9 2011 2  5 2009 2  2009 
10 2011 3  9 2008 3  2008 

這是一個錯誤還是我錯過了什麼?

數據如下(來自dput)。我試圖做一個更小的重現性示例,但我無法確定導致相同錯誤的模式。

d <- structure(list(year = c(2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L), age = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 12L, 12L)), 
.Names = c("year","age"), class = "data.frame", row.names = c(NA, -436L)) 
+0

您可以用'C(代表代碼壓縮重複(2010,136)代表(2011,152),...)' – smci 2015-03-31 05:39:37

+1

其實只是做'(...)'。您將得到'運行長度編碼長度:int [1:...] 136 152 ... values:num [1:...] 2010 2011 ...' – smci 2015-03-31 05:53:38

回答

2

如果您添加缺少的尾部%>% ungroup();您正在跳過拆分應用組合中的組合步驟。 我不知道這是甚至定義的行爲,試圖在grouped_df上運行,而不是數據幀。

d <- group_by(d,year,age) %>% summarize(catch=n()) %>% ungroup() 

mutate(d,yrclass=year-age,fage=as.factor(age),fyrclass=as.factor(yrclass)) 
Source: local data frame [27 x 6] 

    year age catch yrclass fage fyrclass 
1 2010 3  1 2007 3  2007 
2 2010 4  1 2006 4  2006 
3 2010 5  1 2005 5  2005 
4 2010 6  1 2004 6  2004 
5 2010 7  1 2003 7  2003 
6 2010 8  1 2002 8  2002 
7 2010 9  1 2001 9  2001 
8 2010 10  1 2000 10  2000 
9 2011 2  1 2009 2  2009 
10 2011 3  1 2008 3  2008 
.. ... ... ...  ... ...  ... 

而且通過可以壓縮你的測試用例的方式(使用rle),以獲得:

d <- data.frame(year = c(rep(2010,152), rep(2011,136),rep(2012,148)), 
    age = c(rep(3,13), rep(4,10), rep(5,19), rep(6,24), rep(7,19), 
      rep(8,32), rep(9,22), rep(10,13), rep(2,5), rep(3,9), 
      rep(4,11), rep(5,13), rep(6,19), rep(7,12), rep(8,17), 
      rep(9,28), rep(10,11), rep(11,11), rep(3,26), rep(4,47), 
      rep(5,23), rep(6,13), rep(7,11), rep(8,7), rep(9,9), 
      rep(10,10), rep(12,2))) 

>which we got from 
> rr <- rle(d$age) 
> print(paste('rep(', unlist(as.list(paste(rr$values, rr$lengths, sep=','))) , '),', sep=''), quote=F) 
+0

感謝您的及時回覆。使用'ungroup'確實可以解決這個問題,就像我使用'as.data.frame'一樣。你的回答也表明你認爲這是一個錯誤。所以,這是一個錯誤,還是打算使用'ungroup'?我如何向別人解釋爲什麼'ungroup'在這裏是必要的。 – 2015-03-31 13:10:35

+0

也謝謝'rle'。這對我來說是新的。 – 2015-03-31 13:11:28

+0

我編輯我的答案是更清楚的:可能你所做的是錯誤的(跳過取消組步驟),我不知道這是甚至定義行爲試圖對'grouped_df',而不是數據幀進行操作。 – smci 2015-03-31 14:47:56