R:将矩阵分成等份,保留继承并保存部分
Posted
技术标签:
【中文标题】R:将矩阵分成等份,保留继承并保存部分【英文标题】:R: Split a matrix in equal parts, retain succession and save parts 【发布时间】:2013-10-28 19:12:23 【问题描述】:我有一个矩阵 (first.transactions.data),其中包含两列 id 和日期以及 12499 行。
id date
1 19164958 2001-09-01
2 39244924 2001-11-01
3 39578413 2001-09-01
4 40992265 2001-11-01
5 43061957 2001-09-01
6 47196850 2001-11-01
7 51236987 2001-11-01
8 51326773 2001-09-01
9 54271247 2001-09-01
10 70765025 2001-09-01
11 70781923 2001-09-01
12 70782614 2001-09-01
13 70797166 2001-09-01
14 70992941 2001-09-01
15 70995813 2001-09-01
现在我想编写一个函数,可以将该矩阵划分为等长的子矩阵 n。例如,当 n = 3 时,矩阵 1/A 包含第 1 到 5 行,第二个矩阵 2/B 包含第 6 到 10 行,最后一个矩阵 3/C 包含第 11 到 15 行。
我尝试过使用 split 或 cut,但遇到了几个问题。例如
sub <- split(first.transactions.data, cut(first.transactions.data$id, 10))
结果:
$`(1.91e+07,2.61e+07]`
id date
1: 19164958 2001-09-01
$`(2.61e+07,3.3e+07]`
Empty data.table (0 rows) of 2 cols: id,date
$`(3.3e+07,4e+07]`
id date
1: 39244924 2001-11-01
2: 39578413 2001-09-01
$`(4e+07,4.7e+07]`
id date
1: 40992265 2001-11-01
2: 43061957 2001-09-01
或sub <- split(first.transactions.data, sample(rep(1:29, 431)))
产量:
$`1`
id date
1: 71189663 2001-09-01
2: 71307343 2001-09-01
3: 71361917 2001-09-01
4: 71410408 2001-09-01
5: 71518508 2001-09-01
---
427: 88698009 2002-01-01
428: 88698658 2002-01-01
429: 88700541 2002-01-01
430: 88700697 2002-01-01
431: 88701106 2002-01-01
$`2`
id date
1: 71172578 2001-09-01
2: 71608016 2001-09-01
3: 71647277 2001-09-01
4: 71834223 2001-09-01
5: 71998882 2001-09-01
---
427: 88702992 2002-01-01
428: 88703276 2002-01-01
429: 88703439 2002-01-01
430: 88704952 2002-01-01
431: 88705136 2002-01-01
第一个命令不会输出同样长的部分(我认为它使用分位数而不是观察次数)。第二个命令似乎在原始矩阵的随机观察中对矩阵进行了子集化。此外,我必须指定要划分的部分以及子集的长度。最后,我不知道如何访问每个子矩阵的内容。
我想创建这些子矩阵以将它们用作同类群组。对于群组,我稍后想在完整的数据集中检查有多少 ID 在后期仍然存在,以按群组计算个人的留存率。
我可以为此使用命令 split 和 cut 吗?我是否需要其他命令,或者我的方法在 R 中甚至不可行?
非常感谢您的时间和帮助。
帕特里克
PS:对不起,我介绍了矩阵。我不知道如何正确编辑它。
【问题讨论】:
【参考方案1】:你确实需要split
:
split(first.transactions.data, rep(1:3, each = 5))
(根据您的需要调整数字,也许让它们nrow
-dependent)
【讨论】:
有没有办法利用完整的数据集? @Patrik 不确定这意味着什么 - 如何利用它? 使用所有数据并且不要删除一些行来接收与除数相对应的足够长的子集。请记住,我希望有一个功能,我可以指定任意数量的群组,而不仅仅是一个特定的数字,例如3. @Patrik - 听起来你在问如何为任意nrow
和n
获得上面的数字3 和5,答案当然是用n
和5 与ceiling(nrow(your_data)/n)
感谢您的意见。这是我要求的一件事。然而,一个问题仍然存在。如果我没有碰巧碰到合适的数字,我会收到警告: In split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) : Data length is not分裂变量的倍数以上是关于R:将矩阵分成等份,保留继承并保存部分的主要内容,如果未能解决你的问题,请参考以下文章