R 基于条件比较两个数据帧

R 基于条件比较两个数据帧,r,plyr,R,Plyr,我有以下两个数据帧df1由单个用户参数的平均大小组成df2包含用户相同参数的每日平均值 我想计算每个用户发生df2$size>df1$size事件的天数 df1 = read.table(text='user size AAL0706 29000 AAN0823 25000 AAV0450 30000', stringsAsFactors=FALSE, header=TRUE) df2 = read.table(text='Date user size 2010-0

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

我想计算每个
用户发生
df2$size>df1$size
事件的天数

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))
    })
})

你能告诉我一种有效的方法吗?

我们可以从
dplyr
中进行
左连接
,按“用户”分组,得到逻辑索引(
size.x>size.y
)的


使用data.table的一个更简单的解决方案是使用data.table当前开发版本v1.9.7中提供的新的
非相等连接功能

require(data.table)
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI]
df1
的每一行都与
df2
的所有行相匹配,这是基于
参数上提供给
的条件,即匹配
用户
的精确值,并查找
df2
大小
大于该
用户
的所有行

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

请参阅devel版本的安装说明。

使用“dplyr”库有助于我用“聚合”函数替换我正在做的大部分工作。在处理大型数据集时,我一直在努力解决“聚合”函数的内存问题。我相信“dplyr”包是解决我的问题的一个很好的选择
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
require(data.table)
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI]