我想计算一组对象在多个浓度下测得的几个特征的曲线下面积。 MESS auc函数(在这里描述:Calculate the Area under a Curve in R)为我提供了auc,但是我无法弄清楚将其应用于数据文件中所有主题的每一列(功能)。
我的数据基本上是这样组织的:
rowname id conc feature1 feature2 feature3 ...
s1 ccr01 5 18575 80337 100496
s2 ccr01 4 18161 65723 109037
s3 ccr01 3 18092 99807 105363
s4 ccr01 2 5196 71520 84113
s5 ccr01 1 3940 50236 77145
s6 ccr02 5 1878 21812 10306
s7 ccr02 4 3660 18437 13408
s8 ccr02 3 4439 28379 25899
s9 ccr02 2 2710 22960 28080
s10 ccr02 1 1970 23557 22409
.
.
.
我想返回按唯一主题ID(行)排序的功能AUC(列)的矩阵/ df:
rowname feature1 feature2 feature3
ccr01 52338.61 300823.6 388368.2
ccr02 12914.41 91486.32 84316.82
任何建议将不胜感激!
最佳答案
使用链接的帖子中的函数和plyr
获得函数ddply
,这可能会起作用(并且数据名为dat
)
library(zoo)
AUC <- function(x, fs)
sapply(fs, function(f) sum(diff(x$conc)*rollmean(x[,f],2)))
library(plyr)
ddply(dat, .(id), function(x) {
x <- x[order(x$conc),]
AUC(x, grep("feature", names(x), value=T))
})
# id feature1 feature2 feature3
# 1 ccr01 52706.5 302336.5 387333.5
# 2 ccr02 12733.0 92460.5 83744.5
在这里,
fs
是包含feature
字符串的列,因此它仅将AUC
函数应用于按id
分组的那些列。dplyr
解决方案,library(dplyr)
AUC <- function(x, fs)
setNames(as.data.frame(
lapply(fs, function(f) sum(diff(x$conc)*rollmean(x[,f], 2)))),
fs)
dat %>%
group_by(id) %>%
arrange(conc) %>%
do(AUC(., grep("feature", names(.), value=T)))
关于r - 计算R中矩阵中各列的曲线下面积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30905739/