Заполните новую таблицу в Nested для цикла в r - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть две таблицы: Table1 содержит временные ряды для года:

Date year month hour value 01/01/2020 2020 1 0 1800 01/01/2020 2020 1 1 1300 01/01/2020 2020 1 2 400 01/01/2020 2020 1 3 1235 01/01/2020 2020 1 4 120.014 01/01/2020 2020 1 5 812.54

и т. Д.

У меня есть еще Table2 вкоторый фиксированное распределение Factor дается в таблице для определенной Name (Страна)

Name Factor UK 0.003 BE 0.018 DE 0.28 FR 0.43

Теперь я хочу создать еще один кадр данных / таблицу Table3, котораябудет заполнен вложенным циклом из двух таблиц Table1 и Table2 таким образом, что Value каждого Hour из Table1 будет умножено на Factor из Name (страны) изTable2 и цикл выполняется в течение всего года, т.е. количество строк в Table1.Таким образом, первые Value из Table1, т.е. 1800 будут распределены в соответствии с Factor в Table2.Ex.для UK это будет 1800*0.003=5.4 Таким образом, результат Table3 предположим, что будет таким (учитывая только в течение двух часов):

Table3

Name Date Year Month Hour New_value UK 01/01/2020 2020 1 0 5.4 BE 01/01/2020 2020 1 0 32.4 DE 01/01/2020 2020 1 0 504 FR 01/01/2020 2020 1 0 774 UK 01/01/2020 2020 1 1 3.9 BE 01/01/2020 2020 1 1 23.4 DE 01/01/2020 2020 1 1 364 FR 01/01/2020 2020 1 1 559

Итак, Value 1800 будет распределено среди всех Names, затем 1300 и так далее на весь год.Вот как я это сделал во вложенном цикле:

Table3 <- matrix(ncol=6, nrow=24)
#This dimension is just for sake of example but varies in my actual solution` 

for (row in 1:nrow(Table1)) {
# This is outer loop which runs over the year
  Value <- Table1[row, "Value"]
  date  <- Table1[row, "Date"]
  Year  <- Table1[row, "Year"]
  Month <- Table1[row, "Month"]
  Hour  <- Table1[row, "Hour"]
  for (r in 1:nrow(Table2))# This is inner loop which runs over the number of Names   
       {
         Name <- Table2[r, "Name"]
         Factor <- Table2[r, "Factor"]
         Table3[row, ]<-c(Name,Value*Factor,date,Year,Month,Hour)
         #Here I want to manipulate and add the data into a new Table3
         r=r+1 # This is increment in name i.e. Table2
        }
         row=row+1
# This is increment in time hour i.e. Table1
}
Table3 <- data.frame(Table3)

Я не получаю желаемый вывод.Я не уверен, где мой цикл идет не так?Может ли кто-нибудь помочь мне улучшить мой код?Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2019

Если я правильно понимаю ваш пример, цикл не нужен.Поскольку нет общих столбцов, вы можете использовать merge для переработки Table2 для каждого случая Table1.Тогда это просто арифметика.

Table3 <- merge(Table1, Table2)

Table3$new_value <- with(Table3, value * Factor)

head(Table3[order(Table3$hour),], 10)

         Date year month hour value Name Factor new_value
1  01/01/2020 2020     1    0  1800   UK  0.003       5.4
7  01/01/2020 2020     1    0  1800   BE  0.018      32.4
13 01/01/2020 2020     1    0  1800   DE  0.280     504.0
19 01/01/2020 2020     1    0  1800   FR  0.430     774.0
2  01/01/2020 2020     1    1  1300   UK  0.003       3.9
8  01/01/2020 2020     1    1  1300   BE  0.018      23.4
14 01/01/2020 2020     1    1  1300   DE  0.280     364.0
20 01/01/2020 2020     1    1  1300   FR  0.430     559.0
3  01/01/2020 2020     1    2   400   UK  0.003       1.2
9  01/01/2020 2020     1    2   400   BE  0.018       7.2

Данные:

Table1 <- read.table(text="Date       year  month  hour   value 
01/01/2020  2020   1       0    1800
01/01/2020  2020   1       1    1300
01/01/2020  2020   1       2    400
01/01/2020  2020   1       3    1235
01/01/2020  2020   1       4    120.014
01/01/2020  2020   1       5    812.54", header = TRUE)

Table2 <- read.table(text="Name   Factor
UK      0.003
BE      0.018
DE      0.28
FR      0.43", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...