如何在不重复治疗的情况下使用 Rstudio 在五个区块中随机化治疗?
How to randomise treatments in five blocks using Rstudio without a treatment being repeated?
在果园实验中,有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 中做到这一点。
实验的直观表示,其中处理未在其图中随机化:
运行下面的解决方法,我遇到了新的table不显示数字的问题。
Print screen of the command dput(head(data,20))
假设您的数据如下所示:
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
循环继续按组重新采样,直到 none 个块边界彼此相等:
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
请注意 cumsum
和 rle
允许我们 return 块之间的边界索引。 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))
在果园实验中,有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 中做到这一点。
实验的直观表示,其中处理未在其图中随机化:
运行下面的解决方法,我遇到了新的table不显示数字的问题。
Print screen of the command dput(head(data,20))
假设您的数据如下所示:
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
循环继续按组重新采样,直到 none 个块边界彼此相等:
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
请注意 cumsum
和 rle
允许我们 return 块之间的边界索引。 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))