Вот базовое решение R, которое использует lapply()
для генерации корреляций и записи их в list()
. Список преобразуется во фрейм данных с do.call(rbind,...)
.
# simulate some data
set.seed(19041798) # ensure consistency across multiple runs
ID <- rep(1:10,20)
humidity <- rnorm(200,mean = 30,sd = 15)
elapsed_time <- rpois(200,2.5)
data <- data.frame(ID,humidity, elapsed_time)
uniqueIDs <- unique(data$ID)
correlationList <- lapply(uniqueIDs,function(x){
y <- subset(data,ID == x)
HxT <- cor(y$humidity,y$elapsed_time)
# return as data frame
data.frame(ID = x,HxT = HxT)
})
correlations <- do.call(rbind,correlationList)
... и вывод:
> correlations
ID HxT
1 1 -0.1805885
2 2 -0.3166290
3 3 0.1749233
4 4 -0.2517737
5 5 0.1428092
6 6 0.3112812
7 7 -0.3180825
8 8 0.3774637
9 9 -0.3790178
10 10 -0.3070866
>
sqldf () версия
Мы можем реструктурировать код из исходного поста, чтобы он извлекал все данные ему нужно выполнить один запрос SQL и выполнить всю последующую обработку в R.
Сначала мы моделируем 60 000 строк данных.
set.seed(19041798) # ensure consistency across multiple runs
ID <- rep(1:30,2000)
humidity <- rnorm(60000,mean = 30,sd = 15)
elapsed_time <- rpois(60000,2.5)
data <- data.frame(ID,humidity, elapsed_time)
Далее мы извлекаем данные для первых 5 датчиков из данных с sqldf()
, а также вектор уникальных идентификаторов.
library(sqldf)
# select ID <= 5
sqlStmt <- "select ID, humidity,elapsed_time from data where ID <= 5"
dataSubset <- sqldf(sqlStmt)
sqlStmt <- "select distinct ID from data where ID <= 5"
uniqueIDs <- sqldf(sqlStmt)[[1]]
На данный момент кадр данных dataSubset
имеет 10 000 наблюдений. Мы используем lapply()
с вектором уникальных идентификаторов для генерации корреляций на ID
, подсчитываем complete.cases()
, включенные в каждую корреляцию, и записываем результаты в список фреймов данных.
correlationList <- lapply(uniqueIDs,function(x){
y <- subset(dataSubset,ID == x)
count <- sum(complete.cases(y)) # number of obs included in cor()
HxT <- cor(y$humidity,y$elapsed_time)
# return as data frame
data.frame(ID = x,count = count,HxT = HxT)
})
Наконец, do.call(rbind,...)
и отпечаток, и у нас есть наш список корреляций, включая количество строк, используемых для вычисления корреляции.
correlations <- do.call(rbind,correlationList)
correlations
... и вывод:
> correlations
ID count HxT
1 1 2000 0.015640244
2 2 2000 0.017143573
3 3 2000 -0.011283180
4 4 2000 0.052482666
5 5 2000 0.002083603
>