我会执行这个操作,然后随机排序:
mydf[,list(x,v),by=y][sample(seq_len(nrow(mydf)),replace=FALSE)]
注意:分组后的随机重排:
mydf[,list(sum(x),sum(v)), by=y][sample(seq_len(length(y)),replace=FALSE)]
您可以像这样对内容进行分组和随机排序,看起来它确实保留了更改后的顺序:
mydf[order(setNames(sample(unique(y)),unique(y))[y])]
mydf[order(setNames(sample(unique(y)),unique(y))[y]),list(sum(x),sum(v)),by=y]
mydf[{z <- unique(y); order(setNames(sample(z),z)[y])}]
mydf[{z <- unique(y); order(setNames(sample(z),z)[y])},list(sum(x),sum(v)),by=y]
在排序之前先添加一列,这样更加透明。
mydf[,new.y := setNames(sample(unique(y)),unique(y))[y]][order(new.y)]
分解一下:
set.seed(1); mydf[,{z <- unique(y);sample(z)}]
set.seed(1); mydf[,{z <- unique(y);setNames(sample(z),z)}]
set.seed(1); mydf[{z <- unique(y);order(setNames(sample(z),z)[y])}]
编辑:根据评论中Arun的建议使用setattr
设置名称:
mydf[{z <- unique(y); order(setattr(sample(z),'names',z)[y])}]
mydf[{z <- unique(y); order(setattr(sample(z),'names',z)[y])},list(sum(x),sum(v)),by=y]
data.table
然后再进行随机排序呢? - Justin