索引函数中的某些值

时间:2015-03-27 03:21:30

标签: r dataframe

我有一个如下所示的数据框:

 df <- 
 ID      TIME     AMT     k10     k12     k21
1.00    0.00    50.00   0.10    0.40    0.01
1.00    1.00    0.00    0.10    0.40    0.01
1.00    2.00    0.00    0.10    0.40    0.01
1.00    3.00    50.00   0.10    0.40    0.01
1.00    4.00    0.00    0.10    0.40    0.01
2.00    0.00    100.00  0.25    0.50    0.06
2.00    1.00    0.00    0.25    0.50    0.06
2.00    2.00    0.00    0.25    0.50    0.06

我使用k10, k12, k21的值来处理下面函数中的某些计算。这些值中的每一个都特定于主题ID,并且不随时间变化。我的问题是:我怎样才能在函数中编写它,这是每个主题ID的第一个值?正如您在下面的函数中所注意到的,这就是我目前使用的:

  k10 <- d$k10
  k12 <- d$k12
  k21 <- d$k21

这些中的每一个在所有时间点给出相同值的向量,这显然不需要。我只需要一个值。我认为这是我收到number of items to replace is not a multiple of replacement length

警告的原因之一
#This is the function that I am using:
TwoCompIVbolus <- function(d){

  #set initial values in the compartments
  d$A1[d$TIME==0] <- d$AMT[d$TIME==0]  # drug amount in the central compartment at time zero.
  d$A2[d$TIME==0] <- 0                 # drug amount in the peripheral compartment at time zero.

  k10 <- d$k10
  k12 <- d$k12
  k21 <- d$k21
  k20 <- 0
  E1 <- k10+k12
  E2 <- k21+k20

  #calculate hybrid rate constants
  lambda1 <- 0.5*(k12+k21+k10+sqrt((k12+k21+k10)^2-4*k21*k10))
  lambda2 <- 0.5*(k12+k21+k10-sqrt((k12+k21+k10)^2-4*k21*k10))

  for(i in 2:nrow(d))
  {


    t <- d$TIME[i]-d$TIME[i-1]
    A1last <- d$A1[i-1] 
    A2last <- d$A2[i-1]

    A1term = (((A1last*E2+A2last*k21)-A1last*lambda1)*exp(-t*lambda1)-((A1last*E2+A2last*k21)-A1last*lambda2)*exp(-t*lambda2))/(lambda2-lambda1)
    d$A1[i] = A1term + d$AMT[i] #Amount in the central compartment

    A2term = (((A2last*E1+A1last*k12)-A2last*lambda1)*exp(-t*lambda1)-((A2last*E1+A1last*k12)-A2last*lambda2)*exp(-t*lambda2))/(lambda2-lambda1)
    d$A2[i] = A2term            #Amount in the peripheral compartment

  }
  d
}
#to apply it for each subject
simdf <- ddply(df, .(ID), TwoCompIVbolus)

1 个答案:

答案 0 :(得分:1)

您可以使用k10 <- d$k10[1]