根据条件比较两个数据帧
Comparing two dataframes based on a condition
我有以下两个数据框。 df1
包含单个用户的平均参数大小。 df2
包含用户同一参数的日均值。
我想计算 每个 user
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
做一个left_join
,按'user'分组得到逻辑索引(size.x > size.y
)
的sum
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
使用 data.table 的稍微更直接的解决方案是使用 data.table 当前开发版本 v1.9.7.[=24= 中可用的新 non-equi
连接功能]
require(data.table)
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI]
根据提供给 on
参数的条件,df1
的每一行与 df2
的所有行匹配,即匹配 user
的精确值并查找 df2
的 size
大于 within that user
.
的所有行
一旦获得了匹配的行(对于每一行),表达式.N
(=匹配行的计数)被计算为每一行,因为by = .EACHI
暗示了这一点。它指示执行提供给第二个参数 j
到 运行 for each i
(第一个参数)的表达式。
请参阅开发版本 here 的安装说明。
我有以下两个数据框。 df1
包含单个用户的平均参数大小。 df2
包含用户同一参数的日均值。
我想计算 每个 user
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
做一个left_join
,按'user'分组得到逻辑索引(size.x > size.y
)
sum
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
使用 data.table 的稍微更直接的解决方案是使用 data.table 当前开发版本 v1.9.7.[=24= 中可用的新 non-equi
连接功能]
require(data.table)
setDT(df2)[df1, .N, on=.(user, size > size), by=.EACHI]
根据提供给 on
参数的条件,df1
的每一行与 df2
的所有行匹配,即匹配 user
的精确值并查找 df2
的 size
大于 within that user
.
一旦获得了匹配的行(对于每一行),表达式.N
(=匹配行的计数)被计算为每一行,因为by = .EACHI
暗示了这一点。它指示执行提供给第二个参数 j
到 运行 for each i
(第一个参数)的表达式。
请参阅开发版本 here 的安装说明。