使用 R 我有一个 10 行 X 6 列的矩阵。我需要通过对没有重叠的列进行分组,将其拆分为子矩阵。
即矩阵有 A、B、C、D、E、F 列,我需要提取由 AB、CD 和 EF 列形成的 3 个不同的矩阵(或 data.frames 或金融包中的任何对象,如 zoo 或 timeSeries)。
PS:矩阵包含财务数据系列,任何几列都有一个日期列和一个资产净值列
使用 R 我有一个 10 行 X 6 列的矩阵。我需要通过对没有重叠的列进行分组,将其拆分为子矩阵。
即矩阵有 A、B、C、D、E、F 列,我需要提取由 AB、CD 和 EF 列形成的 3 个不同的矩阵(或 data.frames 或金融包中的任何对象,如 zoo 或 timeSeries)。
PS:矩阵包含财务数据系列,任何几列都有一个日期列和一个资产净值列
使用一些虚拟数据(请注意,您必须有一个数据框,否则 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
并从我们的数据框中选择第 th 列i
和i
第 th列,依次从+ 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 ...
将子数据帧保留在列表中的一个优点是,您可以使用循环或类似lapply
或之类的工具将函数或其他操作应用于子数据帧sapply
。
你在寻找这样的东西吗?
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")]
请注意,没有必要为上面的模拟数据创建动物园对象,但从您的问题来看,您的数据看起来如何有点不清楚。