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

cro*_*oss 2 r

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

test <- sqldf("SELECT *, SUM(value) FROM dataFrame GROUP BY run")
Run Code Online (Sandbox Code Playgroud)

我试着像:

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

但不知何故,这SUM发生在每一列dataFrame

akr*_*run 5

正如我们在评论中所讨论的那样,这些sqldf命令获得了sum"运行"分组的"值"列以及每次"运行"的最后一个观察其他列(如果有).

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
Run Code Online (Sandbox Code Playgroud)

要获得类似的输出aggregate,您可以尝试两个aggregate.首先,获得sum"价值",然后是每组最后一次观察的第二个.如果有NA值,请指定na.rm=TRUE参数sum以及na.action=NULLfrom aggregate.默认选项aggregatena.action=na.omit,如果存在任何"NA"值,则可以从计算中删除完整的行.

d1 <- aggregate(value~run, dataFrame, FUN=sum, na.rm=TRUE, na.action=NULL)
d2 <- aggregate(.~run, dataFrame, tail,1, na.action=NULL)
Run Code Online (Sandbox Code Playgroud)

merge通过'run'

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
Run Code Online (Sandbox Code Playgroud)

或使用 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
Run Code Online (Sandbox Code Playgroud)

或者dplyr(感谢@Frank)

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
Run Code Online (Sandbox Code Playgroud)

数据

  set.seed(24)
  dataFrame <- data.frame(run=rep(letters[1:3], 4), 
           value=c(NA,rnorm(11)), value2=c(runif(11), NA))
Run Code Online (Sandbox Code Playgroud)