我有两个维度不同的矩阵。我想对其中一个进行子集化,以便尺寸相同。这两个矩阵是使用 quantmod getSymbol() 得到的 VOO 和 VTI 矩阵。
VOO 为 3415x6,VTI 为 4434x6。对于它们两个具有匹配的尺寸,我必须将 VTI 子集化为 VTI[929:4434,]。我想对多个 ETFS 执行此操作,并且单独查找每个数字进行子集化会很乏味。
我创建了一个函数,可以告诉我一个矩阵比另一个矩阵大多少行,但我想知道是否有一种更简单的方法可以做到这一点,就像已经内置的函数一样。
这是我的代码。
dim(VOO)
dim(VTI)
4434-3415
cor(VTI[929:4343,],VOO)
使用函数测试
matrix.subset <- function(x,y) {
if(dim(x)[1] > dim(y)[1]) {cat("x", ">", "y"," : ",as.numeric(dim(x)[1] - dim(y)[1]))}
if(dim(y)[1] > dim(x)[1]) {cat("y" ,">", "x"," : ",as.numeric(dim(y)[1] - dim(x)[1]))}
}
matrix.subset(VOO,VTI)
输出:
y > x : 928
我会使用
tail
函数,它采用矩阵或数据帧的最后 n
行(或向量的最后 n
值),并可能编写如下函数:
matrix_subset = function(m_list) {
min_rows = min(sapply(m_list, nrow))
lapply(m_list, tail, n = min_rows)
}
此函数接受
list
矩阵输入,找到 n
行最少的矩阵,并将它们全部截断到底部 n
行。 (它不会对列执行任何操作。)然后它会在列表中返回结果。您可以在 2 个矩阵或更多矩阵的列表上使用它。