R按组计数循环聚合

时间:2016-12-25 20:32:20

标签: r count dplyr aggregate

我想编写一个循环,可以聚合按年分组的实例数(某些值)。更具体地说,变量是x1。我希望有两个组,一个是x1 = 1,另一个是某些值的组合(下例中为2,3和5):

year    x1
2000    1
2000    1
2000    2
2000    3
2000    5

最终结果应如下所示:

year    x2    x3
2000    2     3

其中x2x3分别是x1 = 1和x1 = c(2,3,5)时的计数。如何实现这一目标?

编辑:可能应该早些提到这一点。我使用两个数据集;一个df1是一年一次(跨越大约200年)而另一个df2是基于事件的(大约5万次观察;这是x1当前所在的位置)。所以循环的想法是查看df2中的每年[i]并通过将它们分组为x2中的x3df1来汇总计数。

Edit2:啊,我解释了为什么提交的答案对我不起作用。显然我在answer中讨论dplyr问题之前遇到了plyr;我按照ManneR的回答和分离的plyr。现在group_by命令再次起作用。

3 个答案:

答案 0 :(得分:0)

我不确定user3349904的答案有什么问题,因为它似乎正在按照你的要求行事。在不知道您的数据是什么样的情况下,很难确切地知道您要求的内容。如果由于df1需要保持x2和x3值而导致其他解决方案出现问题?最后一部分将解决这个问题。

我试图从头开始复制你的问题,所以这是我的解决方案。

library(dplyr)

#create DF1 (years)
df1 <- as.data.frame(matrix(ncol=3,nrow = 200))
df1$V1 <- c(1800:1999)
colnames(df1) <- c("year","x2","x3")

#create DF2 (transactions)
df2 <- as.data.frame(matrix(ncol=2,nrow=50000))
#add random sample data
df2$V1 <- sample(1800:1999,50000,replace = T)
df2$V2 <- sample(1:5,5000,replace = T)
colnames(df2) <- c("year","x1")

# group by year in df2 and aggregate counts based on categories
df2 %>% group_by(year) %>%
   summarise(x2 = sum(x1==1), x3 = sum(x1 %in% c(2,3,5))) -> df3

# match years in df3 and df1 and bring lookup value to df1
df1$x2 <- df3$x2[match(df1$year,df3$year)]
df1$x3 <- df3$x3[match(df1$year,df3$year)]

答案 1 :(得分:0)

以下是使用dplyr/tidyr

的其他选项
library(dplyr)
library(tidyr)
df1 %>%
    group_by(year, grp = paste0("x", (x1 != 1) + 2)) %>%
    summarise(x1= n()) %>% 
    spread(grp, x1)
#   year    x2    x3
#* <int> <int> <int>
#1  2000     2     3

或使用base R

xtabs(Freq~year + x1, transform(df1, x1= paste0("x", (x1!=1)+2), Freq= 1))

答案 2 :(得分:-1)

假设您从名为df的数据框开始,这将按照您按年描述的情况计算案例:

library(dplyr)
df %>% group_by(year) %>% summarise(x2 = sum(x1==1), x3 = sum(x1 %in% c(2,3,5)))