0

在果园试验中,有5个处理和5个区块。为了分析处理对树木和果实生长的影响,中间树行两侧的处理是相同的。如何在 R 中随机化处理而不使块的最后处理与下一个块的开始处理相同。例如,我使用了 agricolae 包来随机化他们块内的治疗,但我得到了这样的随机化:

Block 1: 3 1 5 2 4 
Block 2: 2 3 4 5 1
Block 3: 2 5 1 4 3 
Block 4: 1 5 3 4 2
Block 5: 2 3 1 5 4

正如您所看到的,第 4 块以治疗 2 结束,然后第 5 块以 2 开始。如果可能的话,我想避免这种情况,但我不确定如何在 r 中做到这一点。

实验的视觉表示,其中处理未在其图中随机化:

该图像是实验的可视化表示,其中处理未在其图中随机化

运行下面的解决方案,我遇到了新表不显示数字的问题。

命令 dput(head(data,20)) 的打印屏幕

4

1 回答 1

1

想象一下,您的数据如下所示:

head(data,10)
#     Block TreeMiddleRow
#1  Block 1   Treatment 1
#2  Block 1   Treatment 2
#3  Block 1   Treatment 3
#4  Block 1   Treatment 4
#5  Block 1   Treatment 5
#6  Block 2   Treatment 1
#7  Block 2   Treatment 2
#8  Block 2   Treatment 3
#9  Block 2   Treatment 4
#10 Block 2   Treatment 5

您可以使用while循环继续按组重新采样,直到没有一个块边界彼此相等:

treatments <- rep("Tretment",nrow(data))
while(any(treatments[head(cumsum(rle(data$Block)$lengths),-1)] == treatments[head(cumsum(rle(data$Block)$lengths),-1)+1])){
  treatments <<- unname(unlist(tapply(data$TreeMiddleRow,
                                      data$Block,
                                      FUN = function(x) sample(x,size = 5, replace = FALSE))))
}
data$TreeMiddleRow <- treatments
head(data,10)
#     Block TreeMiddleRow
#1  Block 1   Treatment 2
#2  Block 1   Treatment 3
#3  Block 1   Treatment 4
#4  Block 1   Treatment 5
#5  Block 1   Treatment 1
#6  Block 2   Treatment 2
#7  Block 2   Treatment 5
#8  Block 2   Treatment 3
#9  Block 2   Treatment 4
#10 Block 2   Treatment 1

请注意,cumsumwithrle允许我们返回块之间边界的索引。head(x,-1)删除最后一个,因为我们不关心它:

head(cumsum(rle(data$Block)$lengths),-1)
#[1]  5 10 15 20

样本数据:

data <- data.frame(Block = rep(paste("Block",1:5),each = 5),
                   TreeMiddleRow = rep(paste("Treatment",1:5),times = 5))
于 2021-02-10T15:27:30.820 回答