2014-09-18 2 views
0

데이터 프레임이 있습니다 (아래 표 참조) : A1 및 A2 값을 계산하고 데이터 프레임에 채우는 코드가 있습니다. 다음은 주제에 대해 A1, A2를 계산하는 코드입니다.for 루프를 함수에 쓰는 방법. Subject ID로 적용하는 방법

#Set parameter values needed for calcuation 
k10 <- 0.2 
k12 <- 0.1 
k21 <- 0.04 
k20 <- 0 
E1 <- k10+k12 
E2 <- k21+k20 
lambda1 = 0.3145683 
lambda2 = 0.02543168 

#Matrix calculations 
for(i in 2:nrow(df)) 
{ 

t <- df$TIME[i]-df$TIME[i-1] 
A1last <- df$A1[i-1] 
A2last <- df$A2[i-1] 
A1term = (((A1last*E2+A2last*k21)-A1last*lambda1)*exp(-t*lambda1)-((A1last*E2+A2last*k21)-A1last*lambda2)*exp(-t*lambda2))/(lambda2-lambda1) 
df$A1[i] = A1term + df$AMT[i]  

A2term = (((A2last*E1+A1last*k12)-A2last*lambda1)*exp(-t*lambda1)-((A2last*E1+A1last*k12)-A2last*lambda2)*exp(-t*lambda2))/(lambda2-lambda1) 
df$A2[i] = A2term 

} 

나는 누군가가 나를 도와 주면 감사하겠습니다 :) 한 모든 ID에 대해 위의 행렬 계산을 적용 즉, (A1에 대한 계산, A2는 ID = 1, 다음 재설정 = 2 ID를 A1, A2를 계산 데이터 프레임에 채우기) 2) 행렬 계산을 함수에 넣습니다. 여기

내 dataframe이 같은 모습입니다 (참고 : R이 안양을 만들기위한 코드는 아래에 제공됩니다)

df <- ID TIME AMT A1 A2 DV WT 
1 0 100 100 0 NA 70 
1 1 0 NA NA NA 70 
1 2 0 NA NA NA 70 
1 3 0 NA NA NA 70 
1 4 0 NA NA NA 70 
1 5 0 NA NA NA 70 
1 6 100 NA NA NA 70 
1 6 0 NA NA NA 70 
1 7 0 NA NA NA 70 
1 8 0 NA NA NA 70 
1 9 0 NA NA NA 70 
1 10 0 NA NA NA 70 
1 11 0 NA NA NA 70 
2 0 50 50 0 NA 120 
2 1 0 NA NA NA 120 
2 2 0 NA NA NA 120 
2 3 0 NA NA NA 120 
2 4 0 NA NA NA 120 
2 5 0 NA NA NA 120 
2 6 0 NA NA NA 120 
2 7 50 NA NA NA 120 
2 8 0 NA NA NA 120 
2 9 0 NA NA NA 120 
2 10 0 NA NA NA 120 
2 11 0 NA NA NA 120 
2 12 0 NA NA NA 120 
2 13 0 NA NA NA 120 
2 14 0 NA NA NA 120 
2 15 0 NA NA NA 120 
2 16 0 NA NA NA 120 
2 17 0 NA NA NA 120 
2 18 0 NA NA NA 120 
2 19 0 NA NA NA 120 
2 20 0 NA NA NA 120 

rm(list=ls(all=TRUE)) 
dosetimes <- c(0,6,12,18) 
df <-  data.frame("ID"=1,"TIME"=sort(unique(c(seq(0,30,1),dosetimes))),"AMT"=0,"A1"=NA,"A2"=NA,"DV"=NA,"WT"=NA) 
doserows <- subset(df, TIME%in%dosetimes) 
doserows$AMT[doserows$TIME==dosetimes[1]] <- 100 
doserows$AMT[doserows$TIME==dosetimes[2]] <- 100 
doserows$AMT[doserows$TIME==dosetimes[3]] <- 50 
doserows$AMT[doserows$TIME==dosetimes[4]] <- 50 
df <- rbind(df,doserows) 
df <- df[order(df$TIME,-df$AMT),]  
df <- subset(df, (TIME==0 & AMT==0)==F) 
df$WT <- 70      
df$WT[df$TIME >= 12] <- 120 
df$ID[(df$WT>=120)==T] <- 2 
df$TIME[df$ID==2] <- c(seq(0,20,1)) 
df$A1[df$TIME==0] <- df$AMT[(df$TIME ==0)] 
df$A2[df$TIME==0] <- 0 

사전에 감사합니다!

+0

당신이 시도 할 수 :'fun1 <- 기능 (DF) {에 대한 (전 2 : nrow (DF)) {t <-..... 안양 $ A2 [ i] = A2term} df}; do.call (rbind, lapply (split (df, df $ ID), function (x) fun1 (x))) ' – akrun

+0

@akrun 감사합니다. 나는 그것을 시도했지만 당신이 제안한 기능은 오류를 주었다. 함수의 마지막에 df}를 넣으려고 했습니까? 나는 그것없이 시도했지만 여전히 do.call (rbind ....)은 결과로서 NULL을 주었다. 어떤 단서? 다시 한 번 감사드립니다. – Amer

+0

코멘트에 전체 코드를 포함시키기가 어려울 정도로 해결책으로 게시했습니다. – akrun

답변

0

시도 :

fun1 <- function(df){ 
for(i in 2:nrow(df)) 
{ 
t <- df$TIME[i]-df$TIME[i-1] 
A1last <- df$A1[i-1] 
A2last <- df$A2[i-1] 
A1term = (((A1last*E2+A2last*k21)-A1last*lambda1)*exp(-t*lambda1)-((A1last*E2+A2last*k21)-A1last*lambda2)*exp(-t*lambda2))/(lambda2-lambda1) 
df$A1[i] = A1term + df$AMT[i]  
A2term = (((A2last*E1+A1last*k12)-A2last*lambda1)*exp(-t*lambda1)-((A2last*E1+A1last*k12)-A2last*lambda2)*exp(-t*lambda2))/(lambda2-lambda1) 
df$A2[i] = A2term 
} 
df 
} 

res <- unsplit(lapply(split(df, df$ID), function(x) fun1(x)), df$ID) 

head(res) 
# ID TIME AMT  A1  A2 DV WT 
#110 1 0 100 100.00000 0.000000 NA 70 
#2 1 1 0 74.24376 8.466067 NA 70 
#3 1 2 0 55.40806 14.434584 NA 70 
#4 1 3 0 41.62585 18.584970 NA 70 
#5 1 4 0 31.53396 21.413134 NA 70 
#6 1 5 0 24.13714 23.281013 NA 70 
+0

당신은 훌륭합니다! :) :) :) :) 당신은 내 하루를 만들었어요! 아주 많이 감사합니다 :) :) – Amer

+0

@Amer 기쁘다. – akrun

관련 문제