如何通过 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
对象,df1
和 df2
看起来是这样的,重新
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
我有两个 xts
对象,df1
和 df2
看起来是这样的,重新
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