我想计算一组对象在多个浓度下测得的几个特征的曲线下面积。 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/

10-12 20:58