2016-07-29 88 views
2

我有以下两个数据帧。 df1由单个用户的平均参数大小组成。 df2包含用户的相同参数的平均每日值。根据条件比较两个数据帧

我想要计算的事件天数df2$size > df1$size对于每个user

df1 = read.table(text='user size 
AAL0706 29000 
AAN0823 25000 
AAV0450 30000', stringsAsFactors=FALSE, header=TRUE) 


df2 = read.table(text='Date user size 
     2010-01-04 AAL0706 31054 
     2010-01-06 AAL0706 20703 
     2010-01-08 AAL0706 39968 
     2010-01-04 AAN0823 17892 
     2010-01-06 AAN0823 37839 
     2010-01-08 AAN0823 19649 
     2010-01-04 AAV0450 35432 
     2010-01-06 AAV0450 37839', stringsAsFactors=FALSE, header=TRUE) 

预期成果是:

user count 
AAL0706  2 
AAN0823  1 
AAV0450  2 

我曾尝试使用下面的命令来计算我的结果,但我知道什么是错的。

lapply(df1, function(y) { 
    ddply(df2$size, .(user), function(x) { 
     return(length(y$size(y$size > x$size)) 
    }) 
}) 

您能否请教我一个这样做的有效方法?

回答

1

我们可以做一个left_joindplyr,由 '用户' 分组得到的逻辑指数(size.x > size.y

library(dplyr) 
left_join(df2, df1, by = "user") %>% 
      group_by(user) %>% 
      summarise(Count = sum(size.x > size.y)) 
#  user Count 
#  <chr> <int> 
#1 AAL0706  2 
#2 AAN0823  1 
#3 AAV0450  2 

或者使用data.table

library(data.table) 
setDT(df2)[df1, .(count = sum(size > i.size)),on = "user", by = .EACHI] 
#  user count 
#1: AAL0706  2 
#2: AAN0823  1 
#3: AAV0450  2 
+1

“dplyr”库的使用有助于我替换大部分使用“聚合”函数进行的工作。处理大型数据集时,我正在用“聚合”函数解决内存问题。我相信“dplyr”包是我的问题的一个很好的选择 – Anna

1

A的sum稍微简单解决方案使用data.table将使用新的non-equi连接功能在c中可用urrent开发版data.table,v1.9.7。

require(data.table) 
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI] 

df1的每行都针对基于提供给on参数的条件,即匹配的user精确值,寻找所有行的df2size是内更大df2所有行匹配那user

一旦获得匹配行(针对每一行),将针对每行评估表达式.N(=匹配行的计数),因为by = .EACHI意味着这一点。它指示执行提供给第二个参数j的表达式,以运行每个i(第一个参数)。

请参阅开发版here的安装说明。