4

グループ化したい変数があります。それは簡単だ。ただし、結果のテーブルにランダムな順序で行をリストする必要があります。私が実際にやりたいことは、もう少し複雑です。ただし、簡略化したバージョンをお見せしましょう。

mydf = data.table(
   x = rep(1:4, each = 5),
   y = rep(c('A', 'B','c','D', 'E'), times = 2),
   v = rpois(20, 30)
)

mydf[,list(sum(x),sum(v)), by=y]
mydf[,list(sum(x),sum(v)), by=list(y=sample(y))]

#to list all the raw data in order of y


mydf[,list(x,v), by=y]
mydf[,list(x,v), by=list(y=sample(y))]

結果の出力を見ると、y が確かにランダムな順序になっていることがわかりますが、y と一緒に行にあったデータからヒンジが外れています。

私に何ができる?

4

2 に答える 2

5

私は操作を行い、ランダムに注文します:

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]

#perhaps more readable:
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)]

それを分解する:

##a random ordering of the elements of y 
##(set.seed is used here to get consistent results)
set.seed(1); mydf[,{z <- unique(y);sample(z)}]
# [1] "B" "E" "D" "c" "A"
##assigning names to the elements of y
##creating a 1-1 bijective function between the elements of y
set.seed(1); mydf[,{z <- unique(y);setNames(sample(z),z)}]
#  A   B   c   D   E 
#"B" "E" "D" "c" "A" 
##subsetting by y puts y through the map
##in effect every element of y is posing as an element of y, picked at random
##notice that the names (top row) are the original y
##the values (bottom row) are the mapped-to values
#  A   B   c   D   E   A   B   c   D   E   A   B   c   D   E   A   B   c   D   E 
#"B" "E" "D" "c" "A" "B" "E" "D" "c" "A" "B" "E" "D" "c" "A" "B" "E" "D" "c" "A"
##ordering by this now orders by the mapped-to values
set.seed(1); mydf[{z <- unique(y);order(setNames(sample(z),z)[y])}]

編集: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]
于 2013-06-19T17:00:48.897 に答える
2

これはあなたが探しているものだと思います...?

mydf[,.SD[sample(.N)],by=y]

@BlueMagister の 2 番目のソリューションに触発された、ランダム化優先の方法を次に示します。

mydf[sample(nrow(mydf)),.SD,by=y]

ここでは、グループをアルファベット順に表示する場合keybyに代わりに使用します。by

于 2013-06-19T17:29:59.313 に答える