我想编写一个循环,可以聚合按年分组的实例数(某些值)。更具体地说,变量是x1
。我希望有两个组,一个是x1
= 1,另一个是某些值的组合(下例中为2,3和5):
year x1
2000 1
2000 1
2000 2
2000 3
2000 5
最终结果应如下所示:
year x2 x3
2000 2 3
其中x2
和x3
分别是x1
= 1和x1
= c(2,3,5)时的计数。如何实现这一目标?
编辑:可能应该早些提到这一点。我使用两个数据集;一个df1
是一年一次(跨越大约200年)而另一个df2
是基于事件的(大约5万次观察;这是x1
当前所在的位置)。所以循环的想法是查看df2
中的每年[i]并通过将它们分组为x2
中的x3
和df1
来汇总计数。
Edit2:啊,我解释了为什么提交的答案对我不起作用。显然我在answer中讨论dplyr
问题之前遇到了plyr
;我按照ManneR的回答和分离的plyr。现在group_by
命令再次起作用。
答案 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)))