在r中的嵌套循环中填充新表

时间:2019-02-24 22:46:23

标签: r

我有两个表: 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,该数据框/表将由两个表Table1Table2的嵌套循环填充,使得 Value中每个Hour的{​​{1}}将与Table1Factor(国家)的Name相乘,并循环运行全年即Table2中的行数。因此,将根据Table1中的Value分发Table1中的第一个1800,即Factor。例如对于Table2,它将是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中,依此类推。这就是我在嵌套for循环中所做的:

1300

我没有得到想要的输出。我不确定我的循环出错了吗?谁能帮我改善代码吗?任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:3)

如果我正确理解您的示例,则无需循环。由于没有公共列,因此对于每种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)