R中数据帧的约束随机化

时间:2018-01-27 17:50:17

标签: r random

我有一个这样的数据框:

 Tem    Time
 10a      1
 10a      2
 10a      3 
 10a      4 
 20a      1
 20a      2
 20a      3
 20a      4 
 10b      1
 10b      2
 10b      3 
 10b      4 
 20b      1
 20b      2
 20b      3
 20b      4 

现在我想做随机化以减少像这样的实验错误

 Tem     Time
 10a      1
 10a      2
 10a      3 
 10a      4 
 20a      4 #( not the same sequence for Time in 10a)
 20a      2
 20a      3
 20a      1 
 #(for b, not same sequence for a in Tem)
 20b      3
 20b      1
 20b      2
 20b      4 
 10b      1 #(not the same sequence for Time in 20b)
 10b      3
 10b      2 
 10b      4 

最后,我需要将所有12个样本随机化。 我知道这很复杂。你能帮我做这个还是给我一些提示?提前致谢!

1 个答案:

答案 0 :(得分:1)

仅在Tem内随机化:

您可以使用tidyverse方法在群组中随机抽样(只有您再次对整个数据集进行抽样):

library(tidyverse)
df <- data.frame(Tem = c("a", "b", "c"), Time = rep(1:4, 3)) %>% arrange(Tem, Time)

df %>% group_by(Tem) %>% sample_frac(1)
# A tibble: 12 x 2
# Groups:   Tem [3]
      Tem  Time
   <fctr> <int>
 1      a     4
 2      a     1
 3      a     2
 4      a     3
 5      b     4
 6      b     2
 7      b     3
 8      b     1
 9      c     3
10      c     2
11      c     4
12      c     1

如果您想随机化Tem以及Time

df %>% group_by(Tem) %>% sample_frac(1) %>% 
  split(df$Tem) %>% { .[sample(names(.), length(names(.)))] } %>%
  bind_rows()
# A tibble: 12 x 2
# Groups:   tem [3]
      tem  time
   <fctr> <int>
 1      c     2
 2      c     1
 3      c     4
 4      c     3
 5      b     4
 6      b     1
 7      b     2
 8      b     3
 9      a     1
10      a     2
11      a     4
12      a     3

(这个样本在Tem样本中与第一个样本相同,但随后将其拆分为由Tem定义的列表并重新对样本进行采样,然后将它们全部绑定在一起。(这可能不是最佳解决方案。)