根据xts对象中的信息将数据帧拆分为多个数据帧

时间:2014-07-16 08:18:28

标签: r split dataframe xts

我真的需要你帮助解决以下问题:

我有两个数据框 - 一个包含ISIN和集群信息的证券组合。

 > dfInput

          TICKER                 CLUSTER                  SECURITY.NAME
1       LU0937588209              High Yield      Prime Capital Access SA SICAV-
2       LU0694362343              High Yield      ECM CREDIT FUND SICAV - ECM Hi
3       IE0030390896              High Yield      Putnam World Trust - Global Hi
4       LU0575374342                 EM Debt      Ashmore SICAV - Emerging Marke
5       LU0493865678                 EM Debt      Ashmore SICAV - Emerging Marke
6       LU0972237696                 EM Debt      Galloway Global Fixed Income F
7       IE00B6TLWG59                 ILS/CAT      GAM Star Fund PLC - Cat Bond F
8       LU0816333396                 ILS/CAT      LGT Lux I - Cat Bond Fund
9       LU0879473352              L/S Credit      Merrill Lynch Investment Solut
10 HINCFEF ID Equity              L/S Credit      Hedge Invest International Fun
11      FR0011034800              L/S Credit      Schelcher Prince Opportunite E
12 PIMCSEI ID Equity              L/S Credit      PIMCO Funds Global Investors S
13     VTR US Equity                   REITs      Ventas Inc
14     HCP US Equity                   REITs      HCP Inc
15   VGSIX US Equity                   REITs      Vanguard REIT Index Fund
16     NLY US Equity                 M REITs      Annaly Capital Management Inc
17    CLNY US Equity                 M REITs      Colony Financial Inc
18    AGNC US Equity                 M REITs      American Capital Agency Corp
19     REM US Equity                 M REITs      iShares Mortgage Real Estate C
20      ES0130960018 Infrastructure Equities      Enagas SA
21    SDRL US Equity Infrastructure Equities      Seadrill Ltd
22     IGF US Equity Infrastructure Equities      iShares Global Infrastructure
23     KMP US Equity                     MLP      Kinder Morgan Energy Partners
24     EPD US Equity                     MLP      Enterprise Products Partners L
25    MLPI US Equity                     MLP      ETRACS Alerian MLP Infrastruct
26    HTGC US Equity                     BDC      Hercules Technology Growth Cap
27    TCPC US Equity                     BDC      TCP Capital Corp
28    MAIN US Equity                     BDC      Main Street Capital Corp
29    BDCS US Equity                     BDC      ETRACS Linked to the Wells Far

另一个包含这些证券的多个时间序列返回,其中安全名称为列名(数据来自excel文件)

> PortfolioR.xts

              Ventas.Inc       HCP.Inc    ....
2011-01-03  0.0000000000  0.0000000000
2011-01-04 -0.0117725362 -0.0056323067
2011-01-05 -0.0081155489  0.0018809625
2011-01-06 -0.0009479572 -0.0154202974
2011-01-07 -0.0058974774 -0.0054674822
2011-01-10 -0.0074691528 -0.0077050464
2011-01-11 -0.0036591278  0.0052348928
2011-01-12  0.0132249172 -0.0091097938
2011-01-13  0.0015220703  0.0085600412
2011-01-14  0.0058762372 -0.0038567541
2011-01-17  0.0000000000  0.0000000000
2011-01-18  0.0157513101 -0.0002760525
2011-01-19 -0.0059712810 -0.0074823683
2011-01-20  0.0013092679  0.0049944610
2011-01-21  0.0013075560 -0.0055509440
...

如何根据投资组合的集群信息现在拆分xts对象?

结果应该是每个CLUSTER一个单独的data.framexts对象,其中包含属于该群集的证券的返回历史记录。

这可能吗?

提前谢谢你......

1 个答案:

答案 0 :(得分:1)

以下是一种方法:

setNames(lapply(unique(dfInput$CLUSTER), function(x) {
  PortfolioR[, which(dfInput$CLUSTER[match(colnames(PortfolioR), 
                                           dfInput$SECURITY.NAME)] == x)]
}), unique(dfInput$CLUSTER))

例如:

# Set up some fake data
d1 <- data.frame(grp=sample(LETTERS[1:4], 10, replace=TRUE),
                 name=letters[1:10])

d1

#    grp name
# 1    A    a
# 2    B    b
# 3    B    c
# 4    D    d
# 5    C    e
# 6    B    f
# 7    B    g
# 8    A    h
# 9    D    i
# 10   A    j

d2 <- matrix(round(runif(50), 2), ncol=10)
colnames(d2) <- letters[1:10]
library(xts)
d2 <- xts(d2, seq.Date(as.Date('01-01-2011', '%d-%m-%Y'), 
                       as.Date('5-01-2011', '%d-%m-%Y'), 1))

d2

#               a    b    c    d    e    f    g    h    i    j
# 2011-01-01 0.51 0.41 0.69 0.87 0.37 0.86 0.47 0.68 0.64 0.73
# 2011-01-02 0.72 0.92 0.53 0.55 0.62 0.54 0.75 0.64 0.04 0.72
# 2011-01-03 0.34 0.50 0.92 0.23 0.59 0.09 0.78 0.53 0.26 0.27
# 2011-01-04 0.52 0.47 0.49 0.25 0.18 0.07 0.65 0.13 0.46 0.74
# 2011-01-05 0.10 0.87 0.10 0.48 0.58 0.72 0.96 0.71 0.78 0.80

out <- setNames(sapply(unique(d1$grp), function(x) {
  d2[, which(d1$grp[match(colnames(d2), d1$name)] == x)]
}), unique(d1$grp))

out 

# $A
#               a    h    j
# 2011-01-01 0.51 0.68 0.73
# 2011-01-02 0.72 0.64 0.72
# 2011-01-03 0.34 0.53 0.27
# 2011-01-04 0.52 0.13 0.74
# 2011-01-05 0.10 0.71 0.80
# 
# $B
#               b    c    f    g
# 2011-01-01 0.41 0.69 0.86 0.47
# 2011-01-02 0.92 0.53 0.54 0.75
# 2011-01-03 0.50 0.92 0.09 0.78
# 2011-01-04 0.47 0.49 0.07 0.65
# 2011-01-05 0.87 0.10 0.72 0.96
# 
# $C
#               d    i
# 2011-01-01 0.87 0.64
# 2011-01-02 0.55 0.04
# 2011-01-03 0.23 0.26
# 2011-01-04 0.25 0.46
# 2011-01-05 0.48 0.78
# 
# $D
#               e
# 2011-01-01 0.37
# 2011-01-02 0.62
# 2011-01-03 0.59
# 2011-01-04 0.18
# 2011-01-05 0.58

如果您希望列表元素(xts个对象)在全局环境中是独立的xts个对象,则可以使用list2env

list2env(out, globalenv())

这将覆盖全局环境中与列表元素具有相同名称的任何对象(即上例中的A,B,C和D)。