首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对矩阵中的行进行随机化,但将R中的组放在一起

对矩阵中的行进行随机化,但将R中的组放在一起
EN

Stack Overflow用户
提问于 2015-04-13 22:50:44
回答 2查看 258关注 0票数 1

我试图逐行随机化一个相当大的矩阵,但我需要将特定列中的相同数字保持在一起。

例如:

代码语言:javascript
复制
# Table A
Column A       Column B
     0.1              1
     0.6              1
     1.5              1
      23              2
      18              2
     0.5              2
     0.6              3
      19              3
     0.7              3

我的目标是按组随机化,在本例中按Column B随机化。我尝试过sample.int(nrow(x)),它可以很好地对所有矩阵进行随机化,但是有没有一种方法可以按组进行呢?

EN

回答 2

Stack Overflow用户

发布于 2015-04-13 23:01:38

一种非常简单的方法是使用"data.table",如下所示:

代码语言:javascript
复制
> library(data.table)
> as.data.table(mydf)[, .(Column_B = sample(Column_A)), by = Column_B]
   Column_B Column_B
1:        1      0.6
2:        1      1.5
3:        1      0.1
4:        2     23.0
5:        2     18.0
6:        2      0.5
7:        3      0.6
8:        3      0.7
9:        3     19.0

或者,更一般地说:

代码语言:javascript
复制
as.data.table(mydf)[, sample(.SD), by = Column_B]

同样,使用"dplyr":

代码语言:javascript
复制
library(dplyr)

mydf %>%
  group_by(Column_B) %>%
  mutate(Column_A = sample(Column_A))
票数 3
EN

Stack Overflow用户

发布于 2015-04-13 23:22:31

不需要转换为data.frame/data.table,也不需要外部包,您可以结合使用?sample?ave

代码语言:javascript
复制
mymat[ave(seq_along(mymat[, "Col_A"]), mymat[, "Col_B"], FUN = sample),]

示例数据:

代码语言:javascript
复制
set.seed(123)
mymat <- cbind(Col_A = rnorm(9), Col_B = rep(1:3, each = 3))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29608382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档