r - 随机化 R 数据表中组的顺序,同时保留组的内部顺序
问题描述
在 R 中,我有以下示例数据表:
library(data.table)
x <- data.table(Group = c("d1", "d1", "d1", "d1", "d2", "d3", "d3", "d4", "d5", "d5", "d5", "d6", "d7", "d7", "d7", "d7", "d7"))
x[, InternalOrder := seq(.N), by = Group]
看起来像这样:
# Input:
#
Group InternalOrder
1: d1 1
2: d1 2
3: d1 3
4: d1 4
5: d2 1
6: d3 1
7: d3 2
8: d4 1
9: d5 1
10: d5 2
11: d5 3
12: d6 1
13: d7 1
14: d7 2
15: d7 3
16: d7 4
17: d7 5
我的目标是随机化数据表 x 中组的顺序,同时保留每个组的内部顺序。
我已经制定了解决方案
groupsizes <- x[, .N, by = Group]$N # Get number of elements (= rows) for each group
set.seed(10)
x[, RandomGroupID := rep(sample(c(1:length(unique(x$Group))), replace = F), groupsizes)] # Make new column with random ID for each group
setorder(x, RandomGroupID, InternalOrder) # Re-order data by random group ID and internal order
给出所需的输出:
# Output (as desired):
Group InternalOrder RandomGroupID
1: d5 1 1
2: d5 2 1
3: d5 3 1
4: d2 1 2
5: d3 1 3
6: d3 2 3
7: d1 1 4
8: d1 2 4
9: d1 3 4
10: d1 4 4
11: d4 1 5
12: d7 1 6
13: d7 2 6
14: d7 3 6
15: d7 4 6
16: d7 5 6
17: d6 1 7
由于我正在尝试提高我的数据表技能,我想知道是否有一个更好、更惯用的解决方案,它不需要创建向量的中间步骤,groupsizes
而是使用典型的数据表语法分配一个新列by
论据与.GRP
或.I
或类似的组合。我想到了类似的东西x[, RandomGroupIDAlternative := rep(sample(c(1:length(unique(x$Group))), replace = F), .GRP), by = Group]
,显然不能提供所需的输出。
我期待您的评论,并期待看到这个问题的替代解决方案。
解决方案
这可以通过加入一个随机的组列表来习惯性地完成。
x[sample(unique(Group)), on = "Group"][, RandomGroupID := .GRP, by = Group][]
推荐阅读
- php - 如何从数据库中检索 PHP 值并使用 AJAX 在页面上更新
- python - 在 pytorch 中编写训练循环时遇到问题
- html - 图标不能使用悬停
- android - URL未在webview android中加载
- amazon-web-services - VPC中不同的CIDR Block是否会有不同的定价
- algorithm - 描述一种算法,以确定在具有新边的新 DFS 运行中是否可能出现相同的发现/完成时间
- dns - DNS 记录中的“IN”是什么?
- pagination - 从 Realm GraphQL 获取光标以实现分页
- pandas - 为什么 Series.min(skipna=True) 会抛出 na 值导致的错误?
- kentico - 在 kentico 中显示来自 CMS_User 的数据