R:分割相等的矩阵,保留连续并保存零件

时间:2013-10-28 19:12:23

标签: r matrix save equals divide

我有一个矩阵(first.transactions.data),其中包含两列id和date以及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 = 3,矩阵1 / A,包含第1至第5行,第二矩阵2 / B,包含第6至10行,最后一个矩阵3 / C包含第11至15行。

我尝试过使用拆分或切割,但我遇到了几个问题。 E.g。

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在以后的时间段内仍然存在,以便按群组计算个人的保留率。

我是否可以使用拆分和剪切命令,我需要其他人或者我的方法在R中是不可行的吗?

非常感谢你的时间和帮助。

帕特里克

PS:对不起我对矩阵的介绍。我无法弄清楚如何正确编辑它。

1 个答案:

答案 0 :(得分:2)

您确实需要split

split(first.transactions.data, rep(1:3, each = 5))

(调整数字以满足您的需求,也许让他们nrow - 依赖)