L oop через неправильный список чисел для добавления строк в сводную таблицу - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь написать код, который будет l oop через список целых чисел, которые относятся к ряду датчиков, для предоставления сводной статистики (на данном этапе просто cor ()).

    # GOOD TO HERE
    corr_table <-data.frame(ID = integer()
                            , HxT = double())
    for(j in gt_thrsh_key){ #this is currently set to 2:5 for testing - its a list of sensors I want to summarise

            # extract humidity and time vectors
            x <- sqldf(sprintf("SELECT humidity FROM data_agg_2 WHERE ID = %s",j))
            y <- sqldf(sprintf("SELECT time_elapsed FROM data_agg_2 WHERE ID = %s",j))

            # format into row
            new_row <- data.frame(ID = c(j), HxT = c(cor(x,y))) #insert new variables into row


            # append to dataframe
            corr_table <- rbind(corr_table, new_row)
            print(sprintf("Sensor %s has been summarised.",j)) # check 1
            print(cor(x,y)) # check 2



    }
    print(corr_table)
    assign("data_agg_2", data_agg_2, envir = .GlobalEnv)

Я получаю вывод:

    [1] "Sensor 2 has been summarised." "Sensor 3 has been summarised." "Sensor 4 has been summarised." "Sensor 5 has been summarised."
    humidity -0.08950285        
       ID HxT
    1  2 -0.08950285 #INCORRECT
    2  3 -0.08950285 #INCORRECT
    3  4 -0.08950285 #INCORRECT
    4  5 -0.08950285 #correct

Это только правильное измерение для последней итерации l oop (id = 5) , так что каким-то образом я должен перезаписать предыдущий записей. Кто-нибудь знает, почему это происходит? Или вы можете порекомендовать лучший способ выполнить это l oop?

Спасибо !!

РЕДАКТИРОВАТЬ: отметьте 2, который печатает cor () x и y через l oop подтверждает, что только последний прогон l oop вычисляет значение. Кто-нибудь видел это раньше?

1 Ответ

0 голосов
/ 05 апреля 2020

Вот базовое решение 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
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...