随机化矩阵中的行,但在R中将组保持在一起

时间:2015-04-13 14:50:44

标签: r random

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

例如:

# 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)),它可以很好地随机化所有矩阵,但有没有办法按组进行此操作?

2 个答案:

答案 0 :(得分:3)

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

> 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

或者,更一般地说:

as.data.table(mydf)[, sample(.SD), by = Column_B]

同样,使用" dplyr":

library(dplyr)

mydf %>%
  group_by(Column_B) %>%
  mutate(Column_A = sample(Column_A))

答案 1 :(得分:1)

如果没有转换为data.frame / data.table且没有外部包,您可以将?ave?sample结合使用:

mymat[ave(seq_along(mymat[, "Col_A"]), mymat[, "Col_B"], FUN = sample),]

示例数据:

set.seed(123)
mymat <- cbind(Col_A = rnorm(9), Col_B = rep(1:3, each = 3))