我有一个看起来像这样的数据框:
year <- year
month <- c(1,1,1,1,1,2,2,2,3,3)
county <- c("Upshur", "Upshur", "Upshur", "Collin","Collin","Upshur","Upshur", "Collin","Upshur","Collin")
citation <- c(1,0,1,1,1,0,1,0,1,1)
df <- data.frame(year, month, county, citation)
# year month county citation
#1 2007 1 Upshur 1
#2 2007 1 Upshur 0
#3 2007 1 Upshur 1
#4 2007 1 Collin 1
#5 2007 1 Collin 1
#6 2007 2 Upshur 0
#7 2007 2 Upshur 1
#8 2007 2 Collin 0
#9 2007 3 Upshur 1
#102007 3 Collin 1
#...
我有警察停止的个别事件,根据引用是否有1或0来说明停止是否以引用或票证结束。我打算做的是将这些数据重新编入一个较小的数据框,其中说明了票数和引用的频率每个县每个月。基本上,看起来像这样的东西:
# year month county citations_given warnings_given
2007 1 Upshur 2 1
2007 1 Collin 2 0
2007 2 Upshur 1 0
2007 2 Collin 0 1
2007 3 Upshur 1 0
2007 3 Collin 1 0
...
任何建议,将不胜感激!
我推荐dplyr
包。
library(dplyr)
df %>%
group_by(year, month, county) %>%
summarize(citation_given = sum(citation),
warnings_given = sum(citation == 0))
我强烈建议使用data.table包。
library(data.table)
setDT(df)
df[,list(warn_given = sum(citation==0),cite_given = sum(citation)),
by=c('year', 'month', 'county')]
考虑aggregate
调用中的多个函数,使用基本包清理列名:
agg_df <- setNames(do.call(data.frame,
aggregate(citation ~ year + month + county, df, function(x)
c(citations_given = sum(x),
warnings_given = sum(x==0))
)
), c("year", "month", "county", "citations_given", "warnings_given")
)
agg_df
# year month county citations_given warnings_given
# 1 2007 1 Collin 2 0
# 2 2007 2 Collin 0 1
# 3 2007 3 Collin 1 0
# 4 2007 1 Upshur 2 1
# 5 2007 2 Upshur 1 1
# 6 2007 3 Upshur 1 0