gpt4 book ai didi

r - 有条件地应用函数

转载 作者:行者123 更新时间:2023-12-02 03:25:18 24 4
gpt4 key购买 nike

我有一个像这样的数据框:

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
....

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

A   sum of results (30 + 23, + 33.3)
B sum of results (313 + 323 + 350)

我正在考虑“应用”功能,但找不到让它发挥作用的方法。

最佳答案

有很多替代方法可以做到这一点。请注意,如果您对与 sum 不同的另一个函数感兴趣,则只需更改参数 FUN=any.function,例如,如果您想要 mean >、var length 等,然后将这些函数插入到 FUN 参数中,例如 FUN=meanFUN=var 等等。让我们探索一些替代方案:

聚合基函数。

> aggregate(results ~ experiment, FUN=sum, data=DF)
experiment results
1 A 86.3
2 B 986.0
<小时/>

或者也许点击

> with(DF, tapply(results, experiment, FUN=sum))
A B
86.3 986.0
<小时/>

还有 plyr 包中的 ddply

> # 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
<小时/>

还有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
<小时/>

使用sapplysplit,相当于tapply

> with(DF, sapply(split(results, experiment), sum))
A B
86.3 986.0
<小时/>

如果您担心时间问题,data.table 是您的 friend :

> # library(data.table)
> DT <- data.table(DF)
> DT[, sum(results), by=experiment]
experiment V1
1: A 86.3
2: B 986.0
<小时/>

不太流行,但 doBy 包很好(相当于aggregate,即使在语法上也是如此!)

> # library(doBy)
> summaryBy(results~experiment, FUN=sum, data=DF)
experiment results.sum
1 A 86.3
2 B 986.0
<小时/>

此外,by 在这种情况下也有帮助

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

如果您希望结果为矩阵,请使用 cbindrbind

> cbind(results=Aggregate.sums)
results
A 86.3
B 986.0
<小时/>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
<小时/>

xtabs 也可以工作(仅当 FUN=sum 时)

> xtabs(results ~ experiment, data=DF)
experiment
A B
86.3 986.0

关于r - 有条件地应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16657512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com