R: одна часть кода, если инструкция не выполняется - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь преобразовать мои исходные данные в формат start-stop для регрессии Кокса.Мой исходный набор данных выглядит так:

df = data.frame(initial = c(25, 25, 20, 21, 21, 17), 
                total = c(4.25, 28, 0.5, 38, 14, 43), 
                age = c(30, 53, 20, 59, 35, 60), 
                ethanol = c(0.04, 0.306, 0.201, 0.222, 0.047, 0.085), 
                status = c(0, 0, 0, 0, 0, 1))

Например, для первого наблюдения исходный формат данных выглядит следующим образом:

    initial  total  age  ethanol  status
 1  25       4.25   30    0.04    0

Ожидаемый формат данных выглядит следующим образом:

 id  start  stop     ethanol  status
 1   0.00   25.00    0.00     0
 1   25.00  29.25    0.04     0
 1   29.25  30       0        0

Поэтому я пишу коды, как показано ниже

edf = data.frame(id = integer(), 
                 start = numeric(), 
                 stop = numeric(), 
                 ethanol = numeric(),
                 status = integer())

j = 1

for( i in 1:4){

  if( (df[i, 1] + df[i,2]) >= df[i,3] ){
    edf[j,1] = i
    edf[j,2] = 0
    edf[j,3] = df[i,"initial"]
    edf[j,4] = 0
    edf[j,5] = 0
    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"]
    edf[j,3] = df[i,"initial"] + df[i,"total"]
    edf[j,4] = df[i,"ethanol"]
    edf[j,5] = df[i,"status"]
  } else{
    edf[j,1] = i
    edf[j,2] = 0
    edf[j,3] = df[i,"initial"]
    edf[j,4] = 0
    edf[j,5] = 0

    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"]
    edf[j,3] = df[i,"initial"] + df[i,"total"]
    edf[j,4] = df[i,"ethanol"]
    edf[j,5] = 0

    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"] + df[i,"total"]
    edf[j,3] = df[i,"age"]
    edf[j,4] = 0
    edf[j,5] = df[i,"status"]
  }
}

Но полученный мной кадр данных (например, первое наблюдение):

 id     start    stop    ethanol  status
 1      0.00     25.00   0.00     0
 1      25.00    29.25   0.04     0

Одна строкаотсутствует:

id  start    stop    ethanol  status
1   29.25    30      0        0

Похоже, что последняя часть в операторе else не была выполнена:

    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"] + df[i,"total"]
    edf[j,3] = df[i,"age"]
    edf[j,4] = 0
    edf[j,5] = df[i,"status"]

Я не знаю, что не так, Есть предложения?Я использую R версии 3.4.4 на MacOS (x86_64-apple-darwin15.6.0.) Заранее спасибо!

1 Ответ

0 голосов
/ 23 сентября 2018

Вы не увеличиваете j, номер строки, перед записью первой строки в каждой итерации цикла.Следовательно, вы пишете поверх предыдущего ряда каждый раз.Будет работать следующее:

j = 0

for( i in 1:4){
  j = j + 1
  if( (df[i, 1] + df[i,2]) >= df[i,3] ){
    edf[j,1] = i
    edf[j,2] = 0
    edf[j,3] = df[i,"initial"]
    edf[j,4] = 0
    edf[j,5] = 0
    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"]
    edf[j,3] = df[i,"initial"] + df[i,"total"]
    edf[j,4] = df[i,"ethanol"]
    edf[j,5] = df[i,"status"]
  } else{
    edf[j,1] = i
    edf[j,2] = 0
    edf[j,3] = df[i,"initial"]
    edf[j,4] = 0
    edf[j,5] = 0

    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"]
    edf[j,3] = df[i,"initial"] + df[i,"total"]
    edf[j,4] = df[i,"ethanol"]
    edf[j,5] = 0

    j = j+1
    edf[j,1] = i
    edf[j,2] = df[i,"initial"] + df[i,"total"]
    edf[j,3] = df[i,"age"]
    edf[j,4] = 0
    edf[j,5] = df[i,"status"]
  }
}

Редактировать: есть лучшие способы сделать это.Вероятно, есть какой-то пакет, который может изменить форму данных более легко.Или вы можете создать три шага запуска / остановки в виде отдельных фреймов данных, а затем объединить их.В противном случае вы можете по крайней мере упростить это так:

df$end = df$initial + df$total
for (i in rownames(df)) {
    r = df[i,]
    edf[nrow(edf) + 1,] = list(i, 0, r$initial, 0, 0)
    if (r$end >= r$age){
      edf[nrow(edf) + 1,] = list(i, r$initial, r$end, r$ethanol, r$status)
    }
    else {
      edf[nrow(edf) + 1,] = list(i, r$initial, r$end, r$ethanol, 0)
      edf[nrow(edf) + 1,] = list(i, r$end, r$age, 0, r$status)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...