gpt4 book ai didi

r - 如何在data.table中按变量分组并按随机顺序列出?

转载 作者:行者123 更新时间:2023-12-04 11:44:05 25 4
gpt4 key购买 nike

我有一个要分组的变量。那很容易。但是,我希望结果表按随机顺序列出其行。我真正想做的是稍微复杂一点。但请允许我向您展示一个简化版本。

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 确实按随机顺序排列,但它已与所在行中的数据脱节。

我能做什么?

最佳答案

我会做手术,然后随机订购:

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])}]

编辑:在评论中加入 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]

关于r - 如何在data.table中按变量分组并按随机顺序列出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17196953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com