如何在 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
长数据框,包含 sc
、shp
、t
和 weisurv(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")
我有一个函数 (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
长数据框,包含 sc
、shp
、t
和 weisurv(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")