1
我有一个数据帧,每行计数,如以下:如何优化的过滤和在一个大的R数据帧
name day wages
1 Ann 1 100
2 Ann 1 150
3 Ann 2 200
4 Ann 3 150
5 Bob 1 100
6 Bob 1 200
7 Bob 1 150
8 Bob 2 100
对于每一个唯一的名称/天对,我想以计算总计的范围,例如'当前或第二天工资大于175的人数'。除了工资之外,还有更多的专栏,并且每行有四个时间段应用于每个总计。
我可以通过我的unique'ing数据帧目前完成:
df.unique <- df[!duplicated(df[,c('name','day')]),]
然后为每一行df.unique
,使用下列的函数(为了清楚起见写草书),以df
:
for(i in 1:nrow(df.unique)) {
df.unique[i,"wages_gt_175_day_and_next"] <- wages_gt_for_person_today_or_next(df,175,df.unique[i,"day"],df.unique[i,"name"])
}
wages_gt_for_person_today_or_next <- function(df,amount,day,person) {
temp <- df[df$name==person,]
temp <- temp[temp$day==day|temp$day==day+1,]
temp <- temp[temp$wages > amount,]
return(nrow(temp))
}
在这个微不足道的例子中给我:
name day wages_gt_175_day_and_next
Ann 1 1
Ann 2 1
Ann 3 0
Bob 1 1
Bob 2 0
但是,这似乎是一个非常缓慢的方法,因为我有成千上万的行。有没有更聪明的方法来做到这一点?与矩阵操作的东西,应用,sqldf,类似的东西?
代码重新例如DF:
structure(list(name = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("Ann", "Bob"), class = "factor"), day = c(1,
1, 2, 3, 1, 1, 1, 2), wages = c(100, 150, 200, 150, 100, 200,
150, 100)), .Names = c("name", "day", "wages"), row.names = c(NA,
-8L), class = "data.frame")
谢谢乔兰,它真的很快 – Ina 2012-04-18 14:40:09