Как сохранить результаты цикла во фрейме данных с помощью cbind - PullRequest
0 голосов
/ 30 мая 2018

У меня есть фрейм данных dfSub с несколькими параметрами внутри.Это почасовые данные для использования энергии.Мне нужно отсортировать данные по каждому часу, например, за каждый час получить все значения энергии из фрейма данных.В результате я ожидаю получить фрейм данных с 24 столбцами для каждого часа, строки будут заполнены значениями энергии.

Час указан как 1:24, а во фрейме данных он связан как dfSub $ hr.Heat - это dfSub $ heat

Я создал цикл for и попытался сохранить с помощью cbind, но он не работает, сообщение об ошибке о разном размере строк и столбцов.

Я печатаю результаты и вижу их на экране, но не могу сохранить как d (датафрейм)

вот код:

  d = NULL
    for (i in 1:24) {
      subh= subset(dfSub$heat, dfSub$hr == i)

      print(subh)

    d = cbind(d, as.data.frame(subh))
    }

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

Любая помощь приветствуется.

Часть dfSub

    hr wk month dyid wend     t heat
    1  2     1    1    0  -9.00   81
    2  2     1    1    0  -8.30   61
    3  2     1    1    0  -7.80   53
    4  2     1    1    0  -7.00   51
    5  2     1    1    0  -7.00   30
    6  2     1    1    0  -6.90   31
    7  2     1    1    0  -7.10   51
    8  2     1    1    0  -6.50   90
    9  2     1    1    0  -8.90  114
   10  2     1    1    0  -9.90  110
   11  2     1    1    0 -11.70  126
   12  2     1    1    0  -9.70  113
   13  2     1    1    0 -11.60  104
   14  2     1    1    0 -10.00  107
   15  2     1    1    0 -10.20  117
   16  2     1    1    0  -9.00   90
   17  2     1    1    0  -8.00  114
   18  2     1    1    0  -7.80   83
   19  2     1    1    0  -8.10   82
   20  2     1    1    0  -8.20   61
   21  2     1    1    0  -8.80   34
   22  2     1    1    0  -9.10   52
   23  2     1    1    0 -10.10   41
   24  2     1    1    0  -8.80   52
    1  2     1    2    0  -8.70   44
    2  2     1    2    0  -8.40   50
    3  2     1    2    0  -8.10   33
    4  2     1    2    0  -7.70   41
    5  2     1    2    0  -7.80   33
    6  2     1    2    0  -7.50   43
    7  2     1    2    0  -7.30   40
    8  2     1    2    0  -7.10   8

Ожидаемый результат:

hr1 hr2 hr3 hr4..... hr24
81  61  53  51 ..... 52
44  50  33  41

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

В этом случае можно избежать использования for-loop.Можно использовать tidyr::spread, чтобы конвертировать ваши почасовые данные в широкий формат.

library(tidyverse)
df %>% select(-t, -wend) %>%
  mutate(hr = sprintf("hr%02d",hr)) %>%
  spread(hr, heat)

Результат:

#   wk month dyid hr01 hr02 hr03 hr04 hr05 hr06 hr07 hr08 hr09 hr10 hr11 hr12 hr13 hr14 hr15 hr16 hr17 hr18 hr19 hr20 hr21 hr22 hr23 hr24
# 1  2     1    1   81   61   53   51   30   31   51   90  114  110  126  113  104  107  117   90  114   83   82   61   34   52   41   52
# 2  2     1    2   44   50   33   41   33   43   40    8   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA

Данные:

df <- read.table(text = 
"hr wk month dyid wend     t heat
1  2     1    1    0  -9.00   81
2  2     1    1    0  -8.30   61
3  2     1    1    0  -7.80   53
4  2     1    1    0  -7.00   51
5  2     1    1    0  -7.00   30
6  2     1    1    0  -6.90   31
7  2     1    1    0  -7.10   51
8  2     1    1    0  -6.50   90
9  2     1    1    0  -8.90  114
10  2     1    1    0  -9.90  110
11  2     1    1    0 -11.70  126
12  2     1    1    0  -9.70  113
13  2     1    1    0 -11.60  104
14  2     1    1    0 -10.00  107
15  2     1    1    0 -10.20  117
16  2     1    1    0  -9.00   90
17  2     1    1    0  -8.00  114
18  2     1    1    0  -7.80   83
19  2     1    1    0  -8.10   82
20  2     1    1    0  -8.20   61
21  2     1    1    0  -8.80   34
22  2     1    1    0  -9.10   52
23  2     1    1    0 -10.10   41
24  2     1    1    0  -8.80   52
1  2     1    2    0  -8.70   44
2  2     1    2    0  -8.40   50
3  2     1    2    0  -8.10   33
4  2     1    2    0  -7.70   41
5  2     1    2    0  -7.80   33
6  2     1    2    0  -7.50   43
7  2     1    2    0  -7.30   40
8  2     1    2    0  -7.10   8",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 31 мая 2018

Я нашел решение, которое помогло мне решить мою задачу здесь: Добавление фреймов данных вместе в цикле for

с использованием пустого списка и последующего объединения в фрейм данных

datalist = list()
for (i in 1:24) {
  subh= subset(dfSub$heat, dfSub$hr == i)
  datalist[[i]] = subh
}
big_data = do.call(rbind, datalist)

и cbind, и rbind работают.Спасибо всем за помощь:)

0 голосов
/ 30 мая 2018

С тидиром:

> df<-read.fwf(textConnection(
+ "hr,wk,month,dyid,wend,t,heat
+     1  2     1    1    0  -9.00   81
+     2  2     1    1    0  -8.30   61
+     3  2     1    1    0  -7.80   53
+     4  2     1    1    0  -7.00   51
+     5  2     1    1    0  -7.00   30
+     6  2     1    1    0  -6.90   31
+     7  2     1    1    0  -7.10   51
+     8  2     1    1    0  -6.50   90
+     9  2     1    1    0  -8.90  114
+    10  2     1    1    0  -9.90  110  
+    11  2     1    1    0 -11.70  126
+    12  2     1    1    0  -9.70  113
+    13  2     1    1    0 -11.60  104
+    14  2     1    1    0 -10.00  107
+    15  2     1    1    0 -10.20  117
+    16  2     1    1    0  -9.00   90
+    17  2     1    1    0  -8.00  114
+    18  2     1    1    0  -7.80   83
+    19  2     1    1    0  -8.10   82
+    20  2     1    1    0  -8.20   61
+    21  2     1    1    0  -8.80   34
+    22  2     1    1    0  -9.10   52
+    23  2     1    1    0 -10.10   41
+    24  2     1    1    0  -8.80   52
+     1  2     1    2    0  -8.70   44
+     2  2     1    2    0  -8.40   50
+     3  2     1    2    0  -8.10   33
+     4  2     1    2    0  -7.70   41
+     5  2     1    2    0  -7.80   33
+     6  2     1    2    0  -7.50   43
+     7  2     1    2    0  -7.30   40
+     8  2     1    2    0  -7.10   8"
+ ),header=TRUE,sep=",",widths=c(5,3,6,5,5,7,5))
> 
> library(tidyr)
> df1 <- select(df,dyid,hr,heat)
> df2 <- spread(df1,hr,heat)
> colnames(df2)[2:ncol(df2)] <- paste0("hr",colnames(df2)[2:ncol(df2)])
> df2
  dyid hr1 hr2 hr3 hr4 hr5 hr6 hr7 hr8 hr9 hr10 hr11 hr12 hr13 hr14 hr15 hr16 hr17 hr18 hr19 hr20 hr21 hr22 hr23 hr24
1    1  81  61  53  51  30  31  51  90 114  110  126  113  104  107  117   90  114   83   82   61   34   52   41   52
2    2  44  50  33  41  33  43  40   8  NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA

>

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