我有两个数据帧。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))
})
})你能告诉我一种有效的方法吗?
发布于 2016-07-29 01:59:21
我们可以从left_join从dplyr进行分组,按“用户”获取逻辑索引的sum (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发布于 2016-07-29 07:07:32
使用data.table的一个稍微简单的解决方案是使用当前data.table开发版本v1.9.7中可用的新的non-equi联接功能。
require(data.table)
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI]根据提供给df1参数的条件,对df2的所有行进行匹配,即匹配user的确切值,并查找user中size较大的所有行。
一旦获得了匹配的行(对于每一行),将为每一行计算表达式.N (=匹配行的计数),因为by = .EACHI意味着这一点。它指示执行提供给第二个参数j的表达式,以便为每个i (第一个参数)运行。
有关开发版本这里,请参见安装说明。
https://stackoverflow.com/questions/38649349
复制相似问题