我想计算许多受试者(约200名受试者)的浓度 - 时间曲线的曲线下面积(AUC)。我正在使用MESS包裹:
AUC = auc(data$TIME,data$CONC, type = "spline")
如何将其应用于数据集中的每个唯一ID?并通过在原始数据集中添加新的“AUC”列来保留R中的结果?
数据包含以下列:
ID TIME CONC
1 0 0
1 2 4
1 3 7
2 0 0
2 1 NA
2 3 5
2 4 10
答案 0 :(得分:1)
一种方式是这样的。 foo是你的数据。
library(MESS)
library(dplyr)
foo %>%
group_by(ID) %>%
summarize(AUC = auc(TIME,CONC, type = "spline"))
# ID AUC
#1 1 9.12500
#2 2 12.08335
如果你想保留所有数据,你可以这样做。
foo %>%
group_by(ID) %>%
mutate(AUC = auc(TIME,CONC, type = "spline"))
# ID TIME CONC AUC
#1 1 0 0 9.12500
#2 1 2 4 9.12500
#3 1 3 7 9.12500
#4 2 0 0 12.08335
#5 2 1 NA 12.08335
#6 2 3 5 12.08335
#7 2 4 10 12.08335
答案 1 :(得分:0)
在我看来,@ jazzurro提供的dplyr
解决方案是可行的方法,但这里有一个base
方法可供选择。
d <- read.table(text='ID TIME CONC
1 0 0
1 2 4
1 3 7
2 0 0
2 1 NA
2 3 5
2 4 10', header=TRUE)
library(MESS)
auc <- t(sapply(split(d, d$ID), function(x) {
data.frame(ID=x$ID[1], auc=auc(x$TIME, x$CONC, type='spline'))
}))
merge(d, auc)
# ID TIME CONC auc
# 1 1 0 0 9.125
# 2 1 2 4 9.125
# 3 1 3 7 9.125
# 4 2 0 0 12.08335
# 5 2 1 NA 12.08335
# 6 2 3 5 12.08335
# 7 2 4 10 12.08335