首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据xts对象中的信息将数据帧拆分为多个数据帧

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

Stack Overflow用户
提问于 2014-07-16 08:18:27
回答 1查看 518关注 0票数 1

在以下问题上,我真的需要你的帮助:

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

代码语言:javascript
复制
 > 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文件)。

代码语言:javascript
复制
> 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对象,其中包含属于该集群的证券的返回历史。

这个是可能的吗?

谢谢你提前..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-16 08:46:51

有一种方法可以做到:

代码语言:javascript
复制
setNames(lapply(unique(dfInput$CLUSTER), function(x) {
  PortfolioR[, which(dfInput$CLUSTER[match(colnames(PortfolioR), 
                                           dfInput$SECURITY.NAME)] == x)]
}), unique(dfInput$CLUSTER))

例如:

代码语言:javascript
复制
# 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

代码语言:javascript
复制
list2env(out, globalenv())

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24775621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档