Создать таблицу из векторов

Вопросы по статистическому пакету R. Не обязательно гео.
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Создать таблицу из векторов

Сообщение VistaSV30 » 21 авг 2020, 17:06

Пока сделал так

Код: Выделить всё

N <- 10 # Длинна вектора
a1 <- c(1,5, 8)
a2 <- c(5,9, 20)

b <- lapply(1:length(a1), 
            function(i) {
              dN <- ifelse((a1[i]+a2[i]) %% N == 0, 0, 
                           N-(a1[i]-1+a2[i]) %% N)
              tt <- rep(x = c(0,1,0), times = c(a1[i]-1, a2[i], dN))
              V <- colSums(matrix(tt, ncol = N, byrow=TRUE))
              return(V)
            }
)

B <- Reduce("+", b)
B
Вручную всё посчитал, результат получается правильный.
Изображение
Пробую на реальных данных, пока не получается.
В функции ошибка:
Ошибка в rep(x = c(0, 1, 0), times = c(a1 - 1, a2, dN)) :
неправильный аргумент 'times'

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Создать таблицу из векторов

Сообщение VistaSV30 » 21 авг 2020, 17:37

Получилось!
Изображение

Код: Выделить всё

ds <- sample(1577836800:1580515200, 1000, replace = T)
df <- ds + sample(600:100800, 1000, replace = T)
St <- as.POSIXct(ds, origin = "1970-01-01")
Fh <- as.POSIXct(df, origin = "1970-01-01")
Fr <- data.frame(St, Fh)

library(lubridate)
Tm <- data.frame(St = hour(Fr$St)*60 + minute(Fr$St),
                 Fh = round((as.numeric(Fr$Fh) - as.numeric(Fr$St)) / 60))

a1 <- Tm$St
a1[a1 == 0] <- 1
a2 <- Tm$Fh

b <- lapply(1:length(a1), 
            function(i) {
              dN <- ifelse((a1[i]+a2[i]) %% 1440 == 0, 0, 
                           1440-(a1[i]-1+a2[i]) %% 1440)
              tt <- rep(x = c(0,1,0), times = c(a1[i]-1, a2[i], dN))
              V <- colSums(matrix(tt, ncol = 1440, byrow=TRUE))
              return(V)
            }
)

G <- Reduce("+", b)

D <- data.frame(Time = 0:1439, G)
library(ggplot2)

D$Tm <- as.POSIXct(D$Time, origin = "1970-01-01", tz = "GMT")
ggplot(D, aes(x = Time, y = G)) + 
  geom_point(alpha = 0.3) + 
  geom_smooth()
Сейчас надо настроить вид шкалы X и можно пробовать работать с данными по реальным пожарам!
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Создать таблицу из векторов

Сообщение VistaSV30 » 23 авг 2020, 15:00

Расчеты с использованием функций lapply() и Reduce() требуют слишком много времени и памяти. Для 100 тыс. случаев понадобилось около часа.
Буду пробовать делать так, как советовал gamm
Пример расчетов для вектора длинной в 5 элементов

Код: Выделить всё

a1 <- c(1, 4)
a2 <- c(3, 8) 
A <- data.frame(a1, a2)

G <- rep(0,5)
FF <- function(x){
  tmp <- rep(0, 5 * ceiling((x[1]+x[2]-1)/5))
  if(x[2] > 0) tmp[(x[1]):(x[1]+x[2]-1)] <- 1
  B <- colSums(matrix(tmp, ncol=5, byrow=TRUE))
  assign("G", G + B, envir = .GlobalEnv)  
  return(NULL)
}
apply(A,1,FF)
G
Получилось!!! :!:
Окончательный вариант кода:

Код: Выделить всё

a1 <- hour(V$St)*60 + minute(V$St)
a1[a1 == 0] <- 1
a2 <- V$Tm
Tm <- data.frame(a1, a2)

G <- rep(0,1440)
FF <- function(x){
  tmp <- rep(0, 1440 * ceiling((x[1]+x[2]-1)/1440))
  if(x[2] > 0) tmp[(x[1]):(x[1]+x[2]-1)] <- 1
  B <- colSums(matrix(tmp, ncol = 1440, byrow=TRUE))
  assign("G", G + B, envir = .GlobalEnv)  
  return(NULL)
}
apply(Tm,1,FF)

D <- data.frame(Time = seq(0, 86340, by = 60), G)

D$Tm <- as.POSIXct(D$Time, origin = "1970-01-01", tz = "GMT")
ggplot(D, aes(x = Time, y = G)) + 
  geom_point(alpha = 0.2, colour = "red") + 
  geom_smooth(se = FALSE) +
  scale_x_time(breaks = date_breaks("3 hours"),
             labels = time_format("%H:%M", tz = "GMT"),
             name = "hh:mm")

Данные за весь 2018 и 2019 год (почти миллион записей) вместе с построением графика были обработаны за время порядка одной минуты.

График
Изображение

Еще раз спасибо gamm и nickleb за помощь! :D
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя