我正在使用聚合命令对R中的数据进行分组。我可以通过SQL相对容易地做到这一点,但我无法通过R获得相同的效果。
作为一个例子,这里是一组测试数据,在SQL中提供了我所寻找的内容:
create table #data(v1 varchar(4), v2 int, v3 int, v4 int,v5 int)
insert #data(v1, v2, v3, v4, v5) values(8000, 3, 8, 7, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 4, 9, 8, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 5, 10, 9, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 6, 11, 7, 14)
insert #data(v1, v2, v3, v4, v5) values(8000, 7, 12, 8, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 3, 13, 9, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 4, 14, 7, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 5, 8, 8, 14)
insert #data(v1, v2, v3, v4, v5) values(8000, 6, 9, 9, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 7, 10, 7, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 3, 11, 8, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 4, 12, 9, 14)
insert #data(v1, v2, v3, v4, v5) values(8000, 5, 13, 7, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 6, 14, 8, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 7, 8, 9, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 3, 9, 7, 14)
insert #data(v1, v2, v3, v4, v5) values(8000, 4, 10, 8, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 5, 11, 9, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 6, 12, 7, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 7, 13, 8, 14)
insert #data(v1, v2, v3, v4, v5) values(8000, 3, 14, 9, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 4, 8, 7, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 5, 9, 8, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 6, 10, 9, 14)
insert #data(v1, v2, v3, v4, v5) values(8000, 7, 11, 7, 11)
insert #data(v1, v2, v3, v4, v5) values(8001, 3, 12, 8, 12)
insert #data(v1, v2, v3, v4, v5) values(8002, 4, 13, 9, 13)
insert #data(v1, v2, v3, v4, v5) values(8003, 5, 14, 7, 14)
select * from #data
select v1, sum(v2)
from #data
where v4 <= v3 and v5 > v3
group by v1
drop table #data
在R中,我尝试将聚合与子集命令一起使用,聚合与内联函数(x)...仍然无法以我纯粹的'R'方式希望的方式合并数据。我知道SQL库允许SQL语句在数据结构上进行交易,但我希望避免这种情况,因为我首先从数据库中提取数据,如果我需要诉诸于此,我不妨编写SQL来做到这一点。我正在寻找纯粹的R方式。也许它有点理想化,但这就是希望和梦想。
该子句需要注意的是它是一个排除子句,用于汇总当前行中V2变量未包含的数据。如果不是这样的话,对我来说这对我来说是一个相当简单的问题,但是我并没有在审查的值下将当前行传递给针对较大数据集的函数,或者如果另一个解决方案完全更好。
提前感谢您的帮助。
以下是生成测试数据的R代码:
m.data <- as.data.frame(
cbind(8000:8003, 3:7, 8:14, 7:9, 11:14, 1:28),
row.names=NULL
);
答案 0 :(得分:4)
这是一个玩具示例,说明了Gavin在评论中描述的内容:
dd <- data.frame(v1 = rep(1:4,5),v2 = 1:20,
v3 = runif(20), v4 = runif(20), v5 = runif(20))
#Extract the subset
dd_new <- subset(dd,v4 <= v3 & v5 > v3)
#Using the aggregate command...
> aggregate(dd_new$v2,list(v1=dd_new$v1),sum)
v1 x
1 1 14
2 2 18
3 3 41
4 4 16
#Or the often popular ddply from plyr
> ddply(dd_new,.(v1),summarise,tot = sum(v2))
v1 tot
1 1 14
2 2 18
3 3 41
4 4 16
为了清晰起见,我从聚合中拆分了子集,但正如Gavin所说,如果你愿意,你可以把它全部卷成一行。
答案 1 :(得分:1)
如果你是一个SQL-junkie,试试sqldf。它对大型数据集非常有效。请注意,我使用的是mdata而不是m.data,它需要在SQL中进行转义。
library(sqldf)
mdata <- as.data.frame(
cbind(8000:8003, 3:7, 8:14, 7:9, 11:14, 1:28),
row.names=NULL
);
sqldf("select v1, sum(v2) from mdata where v4 <= v3 and v5 > v3 group by v1")