使用data.table根据R中的列数重复行集

时间:2014-09-13 09:27:10

标签: r data.table

目前在R中,我正在尝试对data.table表执行以下操作:

假设我的数据如下:

Class   Person ID      Index
A       1              3
A       2              3
A       5              3
B       7              2
B       12             2
C       18             1
D       25             2
D       44             2

这里,班级是指一个人所属的班级。 Person ID变量表示人员的唯一标识符。最后,索引告诉我们每个班级有多少人。

由此,我想创建一个新的数据表:

Class   Person ID      Index
A       1              3
A       2              3
A       5              3
A       1              3
A       2              3
A       5              3
A       1              3
A       2              3
A       5              3
B       7              2
B       12             2
B       7              2
B       12             2
C       18             1
D       25             2
D       44             2
D       25             2
D       44             2

我们根据索引变量按类重复每组人员。因此,我们会重复A类3次,因为索引表示为3.

到目前为止,我的代码如下:

setDT(data)[, list(Class = rep(Person ID, seq_len(.N)), Person ID = sequence(seq_len(.N)), by = Index]

但是,我没有得到正确的结果,我觉得有一种更简单的方法可以做到这一点。有人会有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如果该特定订单对您很重要,那么这样的事情可能会起作用:

setDT(data)[, list(PersonID, sequence(rep(.N, Index))), by = list(Class, Index)]
#     Class Index PersonID V2
#  1:     A     3        1  1
#  2:     A     3        2  2
#  3:     A     3        5  3
#  4:     A     3        1  1
#  5:     A     3        2  2
#  6:     A     3        5  3
#  7:     A     3        1  1
#  8:     A     3        2  2
#  9:     A     3        5  3
# 10:     B     2        7  1
# 11:     B     2       12  2
# 12:     B     2        7  1
# 13:     B     2       12  2
# 14:     C     1       18  1
# 15:     D     2       25  1
# 16:     D     2       44  2
# 17:     D     2       25  1
# 18:     D     2       44  2

如果订单不重要,可能是:

setDT(data)[rep(1:nrow(data), Index)]

答案 1 :(得分:0)

如果您想尝试

,可以使用dplyr
library(dplyr)
data %>%
group_by(Class) %>% 
do(data.frame(.[sequence(.$Index[row(.)[,1]]),]))

给出输出

 #      Class Person.ID Index
 #1      A         1     3
 #2      A         2     3
 #3      A         5     3
 #4      A         1     3
 #5      A         2     3
 #6      A         5     3
 #7      A         1     3
 #8      A         2     3
 #9      A         5     3
 #10     B         7     2
 #11     B        12     2
 #12     B         7     2
 #13     B        12     2
 #14     C        18     1
 #15     D        25     2
 #16     D        44     2
 #17     D        25     2
 #18     D        44     2