使用R我有一个10行X 6列的矩阵。我需要把它分成几个子矩阵,每个子矩阵由几列组成,没有重叠。即矩阵具有列A、B、C、D、E、F和I,需要提取由列AB、CD和EF形成的3个不同的矩阵(或数据、帧或金融包内的任何对象,如动物园或时间序列)。附言:矩阵包含财务数据系列,任何一对列都有一个日期列和一个NAV列
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)])
start
lapply
i
+ 1
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 保存在列表中的一个优点是,您可以使用循环或lapply或sapply等工具对子 Dataframe 应用函数或其他操作。
sapply
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对象并不是必需的,但是从您的问题中可以看出,您的数据看起来有一点不清楚。
yduiuuwa3#
另一种选择是先转置矩阵,然后使用split.data.frame按行拆分矩阵:
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
字符串
3条答案
按热度按时间v2g6jxz61#
使用一些虚拟数据(注意你必须有一个矩阵,否则R不允许你在矩阵中保存日期和数字值[除非它们都转换为字符或原始数字表示])
字符串
一个简单的方法是为你想要的列建立一个索引--这里我选择了每对的第一列,1,3,5,等等。
型
然后,我们在
start
中的索引上lapply
,并从我们的 Dataframe 中选择第i
和第i
+ 1
列,其中i
依次从start
获取每个索引(df[i:(i+1)]
)型
其给出:
型
将子 Dataframe 保存在列表中的一个优点是,您可以使用循环或
lapply
或sapply
等工具对子 Dataframe 应用函数或其他操作。avwztpqn2#
你在找这样的东西吗?
字符串
请注意,为上面的模拟数据创建一个zoo对象并不是必需的,但是从您的问题中可以看出,您的数据看起来有一点不清楚。
yduiuuwa3#
另一种选择是先转置矩阵,然后使用
split.data.frame
按行拆分矩阵:字符串