Ошибка при применении group_by / do к фрейму данных, тибблу / назначению - PullRequest
1 голос
/ 07 августа 2020

Я применяю функцию к сгруппированному фрейму данных, используя следующую процедуру с dplyr:

Input2 <- data.frame(ens=rep(as.character(1:51), each=114),
                    dates_UTC= rep(as.character(seq(as.POSIXct("2013-01-01 07:00:00"), as.POSIXct("2013-01-06 00:00:00"), by="1 hour")), 51),
                    LE = sample(c(0,0,0,0,0,0,0,0,0.005,0.004,0.003,0.002,0.001), 114*51, replace=T),
                    ETPh = rep(0, 114*51),
                    ech = rep(1:114, 51),
                    NiveauResR = rep(c(32.1, rep(NA, 113)), each=51),
                    NiveauResS = rep(c(223, rep(NA, 113)), each=51),
                    HU1=rep(c(0.028, rep(NA, 113)), each=51),
                    HU2=rep(c(0, rep(NA, 113)), each=51),
                    HU3=rep(c(0, rep(NA, 113)), each=51),
                    HU4=rep(c(0, rep(NA, 113)), each=51),
                    HU5=rep(c(0, rep(NA, 113)), each=51),
                    HU6=rep(c(0, rep(NA, 113)), each=51))

Qmm_prev <- group_by(Input2, ens) %>%
  dplyr::do(data.frame(dates_prev =.$dates_UTC, Q = test2(.))) %>%
  unnest(cols=c())

С (упрощенно от реальности)

test2 <- function(x){
  Qmm_prev <- vector(length=nrow(x))
  for (ech in 1:nrow(x))
  {
   if (ech < 114){     
      x[ech, 8:ncol(x)] <- c(0,0,0,0,0,0)
    }
    Qmm_prev[ech] <- 10
  }
  return(Qmm_prev)
}

У меня следующая ошибка :

Error: Assigned data `c(0, 0, 0, 0, 0, 0)` must be compatible with row subscript `ech`.
x 1 row must be assigned.
x Assigned data has 6 rows.
i Row updates require a list value. Do you need `list()` or `as.list()`?
Run `rlang::last_error()` to see where the error occurred. 

Этот код проработал несколько месяцев с go, и если я заменю код group_by / do на al oop на «ens», он также будет работать. Я считаю, что для group_by / do что-то не так, но я не могу его найти ... Я знаю, что это происходит из этой строки:

 x[ech, 8:ncol(x)] <- c(0,0,0,0,0,0)

Но поскольку он работает, когда я тестирую это с al oop, не нашел в чем проблема и как исправить ...

Есть ли подсказка?

Спасибо

1 Ответ

0 голосов
/ 07 августа 2020

Сделайте так, как говорится в сообщении об ошибке:

Измените строку с:

x[ech, 8:ncol(x)] <- c(0,0,0,0,0,0)

на

x[ech, 8:ncol(x)] <- as.list(0,0,0,0,0,0)

, и код будет работать должным образом:

Qmm_prev <- group_by(Input2, ens) %>%
  dplyr::do(data.frame(dates_prev =.$dates_UTC, Q = test2(.)))

Однако обратите внимание, что do был заменен и, вероятно, возможен лучший способ написать test2.

...