目前在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]
但是,我没有得到正确的结果,我觉得有一种更简单的方法可以做到这一点。有人会有任何想法吗?谢谢!
答案 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