如何在 R 中使用数据框中的参数并通过时间循环保持它们不变

How to use parameters from data frame in R and loop through time holding them constant

我有一个函数 (weisurv),它有 2 个参数 - sc 和 shp。它是时间 (t) 的函数。时间是一个序列,即 t<-seq(1:100).

weisurv<-function(t,sc,shp){
surv<-exp(-(t/sc)^shp)
return(surv)
}

我有一个数据框 (df),其中包含 sc 和 shp 值的列表(比如 300 多个)。例如,我有:

     M       shp     sc      p  C i
1    1  1.138131 10.592154 0.1  1 1
2 1.01  1.143798 10.313217 0.1  1 2
3 1.02  1.160653 10.207863 0.1  1 3
4 1.03  1.185886  9.861997 0.1  1 4
...

我想将每组 (ROW) sc 和 shp 参数应用于我的函数。因此对于每一行 [i],该函数看起来像 weisurv(t,sc[[i]],shp[i]])。我不明白如何使用 apply 或 adply 来执行此操作,尽管我确定需要其中之一或两者的组合。 最后,我正在寻找一个数据框,它在给定一组 sc 和 shp(随时间保持不变)的情况下每次给出 weisurv 的值。所以如果我有 10 组 sc 和 shp 参数,我最终会得到 10 个 weisurv 时间序列。 谢谢....

不确定最终数据框中所需的确切结构... 而且我认为必须有一种更简洁的方法来执行此操作,但这应该可行。

选项 1 行与您的 df 相同,t 的每个值都有新列 t<n>

for(n in t){
    df$temp <- weisurv(n, df$sc, df$shp)
    names(df)[n+2] <- paste0('t', n)
}

选项 2 长数据框,包含 scshptweisurv(t,sc,shp):

l = length(t)
newdf <- data.frame(sc=rep(df$sc, each=l), shp=rep(df$shp, each=l),
    t=rep(t, times=nrow(df)) )
newdf$weisurv <- weisurv(newdf$t, newdf$sc, newdf$shp)

使用 plyr:

作为矩阵(时间在 cols 中,行对应于 df 的行):

aaply(df, 1, function(x) weisurv(t, x$sc, x$shp), .expand = FALSE)

作为列表:

alply(df, 1, function(x) weisurv(t, x$sc, x$shp))

作为数据框(按照上面的矩阵结构):

adply(df, 1, function(x) setNames(weisurv(t, x$sc, x$shp), t))

作为长数据框(每个 t/sc/shp 组合一行);注意使用 mutate 和 dplyr 中的管道运算符):

newDf <- data.frame(t = rep(t, nrow(df)), sc = df$sc, shp = df$shp) %>%
  mutate(surv = weisurv(t, sc, shp))

您也可以创建一个宽 data.frame 然后使用 reshape2::melt 重新格式化为长:

wideDf <- adply(df, 1, function(x) setNames(weisurv(t, x$sc, x$shp), t))
newDf <- melt(wideDf, id.vars = colnames(df), variable.name = "t", value.name = "surv")
newDf$t <- as.numeric(as.character(newDf$t))

最后一个 newDf 的漂亮情节(使用 ggplot2):

ggplot(newDf, aes(x = t, y = surv, col = sprintf("sc = %0.3f, shp = %0.3f", sc, shp))) +
geom_line() +
scale_color_discrete(name = "Parameters")