将矩阵分解为R中的多对列

qcbq4gxm  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(80)

使用R我有一个10行X 6列的矩阵。我需要把它分成几个子矩阵,每个子矩阵由几列组成,没有重叠。
即矩阵具有列A、B、C、D、E、F和I,需要提取由列AB、CD和EF形成的3个不同的矩阵(或数据、帧或金融包内的任何对象,如动物园或时间序列)。
附言:矩阵包含财务数据系列,任何一对列都有一个日期列和一个NAV列

v2g6jxz6

v2g6jxz61#

使用一些虚拟数据(注意你必须有一个矩阵,否则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)


然后,我们在start中的索引上lapply,并从我们的 Dataframe 中选择第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 ...


将子 Dataframe 保存在列表中的一个优点是,您可以使用循环或lapplysapply等工具对子 Dataframe 应用函数或其他操作。

avwztpqn

avwztpqn2#

你在找这样的东西吗?

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")]

字符串
请注意,为上面的模拟数据创建一个zoo对象并不是必需的,但是从您的问题中可以看出,您的数据看起来有一点不清楚。

yduiuuwa

yduiuuwa3#

另一种选择是先转置矩阵,然后使用split.data.frame按行拆分矩阵:

> t(matrix(1:60,10))|>split.data.frame(rep(1:3,each=2))
$`1`
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    3    4    5    6    7    8    9    10
[2,]   11   12   13   14   15   16   17   18   19    20

$`2`
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]   21   22   23   24   25   26   27   28   29    30
[2,]   31   32   33   34   35   36   37   38   39    40

$`3`
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]   41   42   43   44   45   46   47   48   49    50
[2,]   51   52   53   54   55   56   57   58   59    60

字符串

相关问题