如何通过 R 中的列名将一个 xts 对象的列除以另一个 xts 对象的列

How to divide the columns of an xts object by the columns of another xts object by its column name in R

我有两个 xts 对象,df1df2 看起来是这样的,重新

spectively:

df1:

           |Argentina   |Peru  |Chile  |Colombia    |Brasil   |
----------------------------------------------------------------
2017-01-01 |4           |12    |16     |8           |32       |
2018-01-01 |14          |18    |6      |4           |82       |
2019-01-01 |64          |22    |14     |18          |52       |
2020-01-01 |24          |80    |36     |6           |14       |
2021-01-01 |34          |70    |36     |60          |74      

|

df2:

           |Argentina   |Colombia  |Chile  |Peru  |Brasil    |
----------------------------------------------------------------
2017-01-01 |1           |1         |16     |12     |2        |
2018-01-01 |7           |2         |3      |2      |41       |
2019-01-01 |16          |18        |1      |11     |13       |
2020-01-01 |8           |2         |3      |40     |7        |
2021-01-01 |17          |30        |6      |35     |74       |

并且我想将df1中每一列的每个元素除以df2中相应列(按国家,即按列名)中同一日期的元素。例如,将 df1"Chile" 列的每个元素除以 df2"Chile" 列的相应元素,以获得数据帧 df3

           |Argentina   |Peru  |Chile  |Colombia    |Brasil   |
----------------------------------------------------------------
2017-01-01 |4           |1     |1      |8           |16       |
2018-01-01 |2           |9     |2      |2           |2        |
2019-01-01 |4           |2     |14     |1           |4        |
2020-01-01 |3           |2     |12     |3           |2        |
2021-01-01 |2           |2     |6      |2           |1        |

我想做 df1/df2 但由于 xts 中的列没有相同的顺序,我得到的结果没有意义....你能帮我吗?

诀窍是通过对列名称进行排序来获取相同顺序的数据,并将其用于按顺序 select 列。这仅在两个 xts 对象中的所有列名都相同时才有效。

注意:我已将 df1 和 df2 对象重命名为 df1_xts 和 df2_xts 以表明我们正在处理 xts 对象而不是 data.frames 以避免任何混淆。

# select the column names of both xts objects, via sort 
# and use matrix calculations to do the rest.
df1_xts[,sort(names(df1_xts))] / df2_xts[,sort(names(df2_xts))]

           Argentina Brasil Chile Colombia Peru
2017-01-01         4     16     1        8    1
2018-01-01         2      2     2        2    9
2019-01-01         4      4    14        1    2
2020-01-01         3      2    12        3    2
2021-01-01         2      1     6        2    2