Как я могу запрограммировать цикл в R? - PullRequest
0 голосов
/ 12 октября 2019

Как мне запрограммировать цикл так, чтобы все восемь таблиц вычислялись одна за другой?

Код:

dt_M1_I <- M1_I
dt_M1_I <- data.table(dt_M1_I)
dt_M1_I[,I:=as.numeric(gsub(",",".",I))]
dt_M1_I[,day:=substr(t,1,10)]
dt_M1_I[,hour:=substr(t,12,16)]
dt_M1_I_median <- dt_M1_I[,list(median_I=median(I,na.rm = TRUE)),by=.(day,hour)]

Это должно быть рассчитано для:

M1_I
M2_I
M3_I
M4_I
M1_U
M2_U
M3_U
M4_U

Большое спасибо за помощь!

Ответы [ 2 ]

6 голосов
/ 12 октября 2019

Когда у вас есть несколько переменных одного типа, , особенно , когда вы нумеруете их, как вы это делали, отступайте назад и заменяйте их одной переменной списка. Я не рекомендую делать то, что предложил другой ответ.

То есть вместо M1_I ... M4_I и M1_U ... M4_U, есть две переменные m_iи m_u (использование строчных букв в именах переменных является общепринятым), каждый из которых представляет собой список из четырех data.tables.

В качестве альтернативы вы можете захотеть использовать переменную single , m, который содержит вложенные списки data.tables (m = list(list(i = …, u = …), …)).

Предполагая первое, вы можете выполнить итерацию по ним следующим образом:

give_this_a_meaningful_name = function (df) {
    dt <- data.table(df)
    dt[, I := as.numeric(gsub(",", ".", I))]
    dt[, day := substr(t, 1, 10)]
    dt[, hour := substr(t, 12, 16)]
    dt[, list(median_I = median(I, na.rm = TRUE)), by = .(day, hour)]
}

m_i_median = lapply(m_i, give_this_a_meaningful_name)

(Обратите внимание также на введениепоследовательный интервал между операторами; хорошая читаемость имеет первостепенное значение для написания кода без ошибок.)

1 голос
/ 12 октября 2019

Вы можете использовать комбинацию петли for и функций get / assign следующим образом:

# create a vector of the data.frame names
dts <- c('M1_I', 'M2_I', 'M3_I', 'M4_I', 'M1_U', 'M2_U', 'M3_U', 'M4_U')

# iterate over each dataframe
for (dt in dts){

  # get the actual dataframe (not the string name of it)
  tmp <- get(dt)
  tmp <- data.table(tmp)
  tmp[, I:=as.numeric(gsub(",",".",I))]
  tmp[, day:=substr(t,1,10)]
  tmp[, hour:=substr(t,12,16)]
  tmp <- tmp[,list(median_I=median(I,na.rm = TRUE)),by=.(day,hour)]

  # assign the modified dataframe to the name you want (the paste adds the 'dt_' to the front)
  assign(paste0('dt_', dt), tmp)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...