我有这样的不同数据集
t y a1 a2 a3 a4 a5 a6
1 0.00 19.404 20 0.6 19.404 22 0.06 3
2 0.05 19.398 20 0.6 19.404 22 0.06 3
3 0.10 19.391 20 0.6 19.404 22 0.06 3
4 0.15 19.386 20 0.6 19.404 22 0.06 3
5 0.20 19.381 20 0.6 19.404 22 0.06 3
6 0.25 19.377 20 0.6 19.404 22 0.06 3
7 0.30 19.372 20 0.6 19.404 22 0.06 3
8 0.35 19.368 20 0.6 19.404 22 0.06 3
9 0.40 19.363 20 0.6 19.404 22 0.06 3
10 0.45 19.359 20 0.6 19.404 22 0.06 3
其中a1,a2,a3,a4,a5,a6对于每个数据集都是常量,但对不同的数据集进行了更改。
我想要做的是同时将此功能适用于所有数据集
f <- function(data,pars) {
par1 <- pars[1]
par2 <- pars[2]
par3 <- pars[3]
t <- data[,1]
y <- data[,2]
a1 <- data[,3]
a2 <- data[,4]
a3 <- data[,5]
a4 <- data[,6]
a5 <- data[,7]
a6 <- data[,8]
Tinf <- a2 - (par2*(1-a3)*a4)/(1+par2*a5*a4)
kC <-par1*sqrt(a6)
V <- par1 + par3
tau <- 1/(V*(1+par2*a5*a4))
y <- a1 -(a1-Tinf)*(1-exp(-t/tau))
return(y)
}
所有数据集的参数par1
,par2
,par3
必须相同。任何人都可以帮助我吗?
答案 0 :(得分:0)
我正在使用dplyr方法,需要在为数据集提供唯一ID(标识符)后合并(rbind)数据集。然后它按该id分组,并对每个数据集执行您的过程/功能。我创建了自己的数据,以便有两个数据集可供使用。
另外,我稍微修改了你的函数来指定函数外的参数,并考虑每个数据集的唯一a1,...,a6值。如果您对此不满意,我可以尽可能少地更改您的功能来更新我的流程。
dt1 =
read.table(text="
t y a1 a2 a3 a4 a5 a6
1 0.00 19.404 20 0.6 19.404 22 0.06 3
2 0.05 19.398 20 0.6 19.404 22 0.06 3
3 0.10 19.391 20 0.6 19.404 22 0.06 3
4 0.15 19.386 20 0.6 19.404 22 0.06 3
5 0.20 19.381 20 0.6 19.404 22 0.06 3
6 0.25 19.377 20 0.6 19.404 22 0.06 3
7 0.30 19.372 20 0.6 19.404 22 0.06 3
8 0.35 19.368 20 0.6 19.404 22 0.06 3
9 0.40 19.363 20 0.6 19.404 22 0.06 3
10 0.45 19.359 20 0.6 19.404 22 0.06 3", header=T)
dt2 =
read.table(text="
t y a1 a2 a3 a4 a5 a6
1 0.00 21.409 20 0.8 19.409 20 0.07 5
2 0.05 21.398 20 0.8 19.409 20 0.07 5
3 0.10 21.397 20 0.8 19.409 20 0.07 5
4 0.15 21.386 20 0.8 19.409 20 0.07 5
5 0.20 21.381 20 0.8 19.409 20 0.07 5
6 0.25 21.377 20 0.8 19.409 20 0.07 5
7 0.30 21.371 20 0.8 19.409 20 0.07 5
8 0.35 21.368 20 0.8 19.409 20 0.07 5
9 0.40 21.363 20 0.8 19.409 20 0.07 5
10 0.45 21.351 20 0.8 19.409 20 0.07 5", header=T)
# create an id for each dataset
dt1$id = 1
dt2$id = 2
# bind datasets
dt = rbind(dt1,dt2)
# input parameters
par1 = 2
par2 = 3
par3 = 4
library(dplyr)
dt %>%
group_by(id) %>%
do({ Tinf <- unique(.$a2) - (par2*(1-unique(.$a3))*unique(.$a4))/(1+par2*unique(.$a5)*unique(.$a4))
kC <-par1*sqrt(unique(.$a6))
V <- par1 + par3
tau <- 1/(V*(1+par2*unique(.$a5)*unique(.$a4)))
y <- unique(.$a1) -(unique(.$a1)-Tinf)*(1-exp(-.$t/tau))
data.frame(y) })
# id y
# 1 1 20.0000
# 2 1 194.5705
# 3 1 233.9927
# 4 1 242.8951
# 5 1 244.9055
# 6 1 245.3595
# 7 1 245.4620
# 8 1 245.4852
# 9 1 245.4904
# 10 1 245.4916
# 11 2 20.0000
# 12 2 172.6108
# 13 2 204.6799
# 14 2 211.4187
# 15 2 212.8348
# 16 2 213.1324
# 17 2 213.1949
# 18 2 213.2080
# 19 2 213.2108
# 20 2 213.2114
如果您希望将函数结果连接回初始(组合)数据集,请最后使用此结果:data.frame(dt,y_res=y)