有条件地应用功能

Oli*_*ver 20 aggregate r

我有这样的数据帧:

experiment iter  results
    A       1     30.0
    A       2     23.0
    A       3     33.3
    B       1     313.0
    B       2     323.0
    B       3     350.0
 ....
Run Code Online (Sandbox Code Playgroud)

有没有办法通过应用具有条件的函数来计算结果.在上面的例子中,该条件是特定实验的所有迭代.

A   sum of results (30 + 23, + 33.3)
B   sum of results (313 + 323 + 350)
Run Code Online (Sandbox Code Playgroud)

我正在考虑"应用"功能,但找不到让它工作的方法.

Jil*_*ina 49

有很多替代方法可以做到这一点.请注意,如果你有兴趣,从不同的另一种功能sum,那么只需更改参数FUN=any.function,例如,如果你想mean,var length等等,然后只需将其插入这些功能到FUN参数,例如FUN=mean,FUN=var等等.让我们探讨一些替代方案:

aggregate 在基地的功能.

> aggregate(results ~ experiment, FUN=sum, data=DF)
  experiment results
1          A    86.3
2          B   986.0
Run Code Online (Sandbox Code Playgroud)

或许tapply

> with(DF, tapply(results, experiment, FUN=sum))
    A     B 
 86.3 986.0 
Run Code Online (Sandbox Code Playgroud)

ddply来自plyr包

> # library(plyr)
> ddply(DF[, -2], .(experiment), numcolwise(sum))
  experiment results
1          A    86.3
2          B   986.0

> ## Alternative syntax
> ddply(DF, .(experiment), summarize, sumResults = sum(results))
  experiment sumResults
1          A       86.3
2          B      986.0
Run Code Online (Sandbox Code Playgroud)

另外,dplyr

> require(dplyr)
> DF %>% group_by(experiment) %>% summarise(sumResults = sum(results))
Source: local data frame [2 x 2]

  experiment  sumResults
1          A        86.3
2          B       986.0
Run Code Online (Sandbox Code Playgroud)

使用sapplysplit,相当于tapply.

> with(DF, sapply(split(results, experiment), sum))
    A     B 
 86.3 986.0 
Run Code Online (Sandbox Code Playgroud)

如果你关心时间安排,请问data.table你的朋友:

> # library(data.table)
> DT <- data.table(DF)
> DT[, sum(results), by=experiment]
   experiment    V1
1:          A  86.3
2:          B 986.0
Run Code Online (Sandbox Code Playgroud)

不是那么受欢迎,但doBy包很好(相当于aggregate,甚至在语法上!)

> # library(doBy)
> summaryBy(results~experiment, FUN=sum, data=DF)
  experiment results.sum
1          A        86.3
2          B       986.0
Run Code Online (Sandbox Code Playgroud)

by在这种情况下也有帮助

> (Aggregate.sums <- with(DF, by(results, experiment, sum)))
experiment: A
[1] 86.3
------------------------------------------------------------------------- 
experiment: B
[1] 986
Run Code Online (Sandbox Code Playgroud)

如果您希望结果是矩阵,则使用cbindrbind

> cbind(results=Aggregate.sums)
  results
A    86.3
B   986.0
Run Code Online (Sandbox Code Playgroud)

sqldf 从sqldf包也可能是一个不错的选择

> library(sqldf)
> sqldf("select experiment, sum(results) `sum.results`
      from DF group by experiment")
  experiment sum.results
1          A        86.3
2          B       986.0
Run Code Online (Sandbox Code Playgroud)

xtabs也有效(仅限于FUN=sum)

> xtabs(results ~ experiment, data=DF)
experiment
    A     B 
 86.3 986.0
Run Code Online (Sandbox Code Playgroud)