Я делаю систематические вычисления для моего созданного фрейма данных. У меня есть код для вычислений, но я хотел бы:Создание функции для обработки вычислений моих данных.
1) Рассказать об этом как о функции и вызвать ее для созданного ядро DataFrame.
2) сбросьте вычисления для следующего идентификатора в кадре данных.
Буду признателен за вашу помощь и советы по этому вопросу.
dataframe создается в R, используя следующий код:
#Create a dataframe
dosetimes <- c(0,6,12,18)
df <- data.frame("ID"=1,"TIME"=sort(unique(c(seq(0,30,1),dosetimes))),"AMT"=0,"A1"=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]] <- 100
doserows$AMT[doserows$TIME==dosetimes[4]] <- 100
#Add back dose information
df <- rbind(df,doserows)
df <- df[order(df$TIME,-df$AMT),]
df <- subset(df, (TIME==0 & AMT==0)==F)
df$A1[(df$TIME==0)] <- df$AMT[(df$TIME ==0)]
#Time-dependent covariate
df$WT <- 70
df$WT[df$TIME >= 12] <- 120
#The calculations are done in a for-loop. Here is the code for it:
#values needed for the calculation
C <- 2
V <- 10
k <- C/V
#I would like this part to be written as a function
for(i in 2:nrow(df))
{
t <- df$TIME[i]-df$TIME[i-1]
A1last <- df$A1[i-1]
df$A1[i] = df$AMT[i]+ A1last*exp(-t*k)
}
head(df)
plot(A1~TIME, data=df, type="b", col="blue", ylim=c(0,150))
Другое дело, что предыдущий код предполагает предметную ID = 1 для всех временных точек. Если субъект ID = 2, когда WT (вес) изменяется на 120. Как я могу сбросить вычисления и сделать его автоматизированным для всех идентификаторов объекта в кадре данных? В этом случае исходная датаграмма будет выглядеть так:
#code:
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,"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]] <- 100
doserows$AMT[doserows$TIME==dosetimes[4]] <- 100
df <- rbind(df,doserows)
df <- df[order(df$TIME,-df$AMT),]
df <- subset(df, (TIME==0 & AMT==0)==F)
df$A1[(df$TIME==0)] <- df$AMT[(df$TIME ==0)]
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))
Заранее благодарю вас!
Итак, какая часть этого вы не знаете, как это сделать? Где актуальный вопрос программирования? Сейчас кажется, что это всего лишь просьба «сделай это для меня». – MrFlick
1. Я хотел бы написать for-loop как функцию, чтобы я мог назвать ее для dataframes; как df2 <- calculate.func (df). – Amer
2: Я не знаю, как сбросить вычисления для следующего идентификатора объекта. (т. е. повторите те же вычисления для ID = 2, начиная с TIME = 0 для ID2) @MrFlick – Amer