2013-04-05 102 views
2

使用R 我有10行X 6列矩陣。 我需要將它分割成子矩陣,通過不重疊的多列列。將矩陣拆分爲R中的多對列

即矩陣有列A,B,C,D,E,F和I需要提取3列不同的矩陣(或data.frames或金融包內的任何對象,如動物園或timeSeries)由列AB,CD和EF。

PS:矩陣中包含一些財務數據序列中任何一對夫妻列有一個日期欄和導航欄

+5

你好!請通過看看[**如何使一個偉大的可重複的例子**],使您的文章重現性(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例如)爲我們提供幫助。謝謝。 – Arun 2013-04-05 14:31:42

回答

3

使用一些虛擬數據(注意,您必須有一個數據幀另有R.將不會允許你保存日期和數值在矩陣,除非他們都轉換爲字符或原始數值表示])

set.seed(42) 
df <- data.frame(A = Sys.Date() + 0:9, B = rnorm(10), 
       C = Sys.Date() - 0:9, D = rnorm(10), 
       E = Sys.Date() - 20:29, F = rnorm(10)) 

> head(df) 
      A   B   C   D   E   F 
1 2013-04-05 1.3709584 2013-04-05 1.3048697 2013-03-16 -0.3066386 
2 2013-04-06 -0.5646982 2013-04-04 2.2866454 2013-03-15 -1.7813084 
3 2013-04-07 0.3631284 2013-04-03 -1.3888607 2013-03-14 -0.1719174 
4 2013-04-08 0.6328626 2013-04-02 -0.2787888 2013-03-13 1.2146747 
5 2013-04-09 0.4042683 2013-04-01 -0.1333213 2013-03-12 1.8951935 
6 2013-04-10 -0.1061245 2013-03-31 0.6359504 2013-03-11 -0.4304691 

一個簡單的方法來做到這一點是要形成你想要的列的索引 - 在這裏我選擇了每對的第一列,1,3,5,等

start <- seq(1, by = 2, length = ncol(df)/2) 

然後,我們lapply在指數上在start CES和從我們的數據中選擇第一幀的i和第i+ 1列其中i需要從start依次在每個指數(df[i:(i+1)]

sdf <- lapply(start, function(i, df) df[i:(i+1)], df = df) 

其給出:

> sdf 
[[1]] 
      A   B 
1 2013-04-05 1.37095845 
2 2013-04-06 -0.56469817 
3 2013-04-07 0.36312841 
4 2013-04-08 0.63286260 
5 2013-04-09 0.40426832 
6 2013-04-10 -0.10612452 
7 2013-04-11 1.51152200 
8 2013-04-12 -0.09465904 
9 2013-04-13 2.01842371 
10 2013-04-14 -0.06271410 

[[2]] 
      C   D 
1 2013-04-05 1.3048697 
2 2013-04-04 2.2866454 
.... 

> str(sdf) 
List of 3 
$ :'data.frame': 10 obs. of 2 variables: 
    ..$ A: Date[1:10], format: "2013-04-05" "2013-04-06" ... 
    ..$ B: num [1:10] 1.371 -0.565 0.363 0.633 0.404 ... 
$ :'data.frame': 10 obs. of 2 variables: 
    ..$ C: Date[1:10], format: "2013-04-05" "2013-04-04" ... 
    ..$ D: num [1:10] 1.305 2.287 -1.389 -0.279 -0.133 ... 
$ :'data.frame': 10 obs. of 2 variables: 
    ..$ E: Date[1:10], format: "2013-03-16" "2013-03-15" ... 
    ..$ F: num [1:10] -0.307 -1.781 -0.172 1.215 1.895 ... 

保持的一個優點列表中的子數據幀就是您可以使用循環或諸如lapplysapply等工具對子數據幀應用功能或其他操作。

1

您正在尋找這樣的事情?

require("zoo") 
##matrix with random entries 
mat <- matrix(rnorm(60), nrow=10, ncol=6) 
colnames(mat) <- LETTERS[1:6]  
## optional: create zoo object 
#mat <- as.zoo(mat) 


##access columns 
mat[,c("A", "B")] 
mat[,c("C", "D")] 
mat[,c("E", "F")] 

注意,創建上述模擬數據的動物園對象是沒有必要的,但是從你的問題實在是有點不清楚你的數據的樣子。

+0

現在想象一下,有1000列,因此500對。使用索引以編程方式執行此操作會更好。 – 2013-04-05 14:44:05

+0

@Gavin Simpson:我明白你的意思,但在提問中提到了一個10x6矩陣。 – user1981275 2013-04-05 14:47:29

+0

噢,的確,對於這個手工操作的小問題,我的解決方案比解決問題的鍵擊更少。 – 2013-04-05 14:52:49