什么是聚合sqldf查询的普通R等价物?

时间:2015-06-18 14:22:29

标签: r

以下R查询的简单sqldf等效命令是什么“

test <- sqldf("SELECT *, SUM(value) FROM dataFrame GROUP BY run")

我试着像:

test <-aggregate(dataFrame$value, by=list(dataFrame$run), FUN=sum, na.rm=TRUE)

SUM

的每一列都发生dataFrame

1 个答案:

答案 0 :(得分:5)

正如我们在评论中所讨论的那样,sqldf命令获得了sum的&#39;值&#39;列按&#39;运行&#39;以及最后一次观察每个&#39;运行的其他列(如果有的话)。

library(sqldf)
sqldf("SELECT *, SUM(value) FROM dataFrame GROUP BY run")
#  run        value    value2 SUM(value)
#1   a -0.848370044 0.2387489 -0.1627249
#2   b  0.002311942 0.3688175 -0.6826107
#3   c -1.316908124        NA -0.3993579

要使用aggregate获得类似的输出,您可以尝试两个aggregate。首先,要获得&#39;值的sum&#39;第二次是每组最后一次观察。如果有NA个值,请指定na.rm=TRUE的{​​{1}}参数以及sum中的na.action=NULLaggregate中的默认选项为aggregate,如果存在任何&#39; NA&#39},则可以从计算中删除完整的行。值。

na.action=na.omit

d1 <- aggregate(value~run, dataFrame, FUN=sum, na.rm=TRUE, na.action=NULL) d2 <- aggregate(.~run, dataFrame, tail,1, na.action=NULL) 按&#39;运行&#39;

merge

或使用merge(d1, d2, by='run') # run value.x value.y value2 #1 a -0.1627249 -0.848370044 0.2387489 #2 b -0.6826107 0.002311942 0.3688175 #3 c -0.3993579 -1.316908124 NA

data.table

library(data.table) setDT(dataFrame)[,c(.SD[.N], SUMVALUE=sum(value, na.rm=TRUE)) , run] # run value value2 SUMVALUE #1: a -0.848370044 0.2387489 -0.1627249 #2: b 0.002311942 0.3688175 -0.6826107 #3: c -1.316908124 NA -0.3993579 (感谢@Frank)

dplyr

数据

library(dplyr)
dataFrame %>%
    group_by(run) %>%
    mutate(SUMVALUE=sum(value,na.rm=TRUE)) %>%
    slice(n())
#  run        value    value2   SUMVALUE
#1   a -0.848370044 0.2387489 -0.1627249
#2   b  0.002311942 0.3688175 -0.6826107
#3   c -1.316908124        NA -0.3993579