簡體   English   中英

如何使用來自兩個 XTS 的數據來創建一個新的 XTS?

[英]How to use data from two XTS to create a new XTS?

假設我有以下兩個 XTS ......

a <- c(1,2,3,4)
b <- c(2,4,6,8)
x <- xts(cbind(a,b),order.by = as.Date(c("2015-01-02","2015-01-05","2015-01-06","2015-01-07")))
x

c <- c("a","b","b","a","a","b")
d <- c(10,20,10,30,20,40)
y <- xts(cbind(c,d),order.by = as.Date(c("2015-01-02","2015-01-02","2015-01-05","2015-01-06","2015-01-07","2015-01-07")))
y

這些給我...

           a b
2015-01-02 1 2
2015-01-05 2 4
2015-01-06 3 6
2015-01-07 4 8

           c   d   
2015-01-02 "a" "10"
2015-01-02 "b" "20"
2015-01-05 "b" "10"
2015-01-06 "a" "30"
2015-01-07 "a" "20"
2015-01-07 "b" "40"

我想獲得以下 XTS ......

            a  b
2015-01-02 10 20
2015-01-05 NA 10
2015-01-06 30 NA
2015-01-07 20 40

我嘗試了幾種不同的方法,例如使用函數 match 和 coredata,但無法得到確切的答案。 我認為也許從第一個 XTS 的空白值開始,然后用第二個 XTS 的值填充它會效果最好。 不知道該怎么做。

問題是xts object 也是一個matrix

is.matrix(x)
#[1] TRUE

根據?matrix

as.matrix 是一個通用的 function。 如果只有原子列和任何非(數字/邏輯/復雜)列,則數據幀的方法將返回字符矩陣,將 as.vector 應用於因子並將格式應用於其他非字符列。 否則,將使用通常的強制層次結構(logical < integer < double < complex),例如,所有邏輯數據幀將被強制轉換為邏輯矩陣,混合邏輯整數將給出 integer 矩陣等。

並且matrix只能容納單個 class。 如果有單個character元素,它將整個數據集更改為character class

這看起來像是y object 的重塑。 如果將其轉換為 dataframe,則使用 dataframe 進行整形/預處理,然后將其轉換回xts object,這將很簡單。

library(tidyverse)
library(xts)

data.frame(y) %>%
  rownames_to_column('date') %>%
  mutate(date = as.Date(date, "X%Y.%m.%d")) %>%
  pivot_wider(names_from = c, values_from = d) %>%
  #For old tidyr use spread instead of pivot_wider
  #spread(c, d) %>%
  mutate_at(vars(a, b), ~as.integer(as.character(.)))  %>%
  column_to_rownames('date') %>%
  as.xts 

#            a  b
#2015-01-02 10 20
#2015-01-05 NA 10
#2015-01-06 30 NA
#2015-01-07 20 40

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM