gpt4 book ai didi

R:根据因子顺序分配数字到一个限制,然后重复序列直到结束

转载 作者:行者123 更新时间:2023-12-02 01:47:27 26 4
gpt4 key购买 nike

我正在尝试根据独特的处理组合分配地 block 。

以下代码将生成我正在尝试创建的数据工作表:

mom_id = rep(1:20, each=120)

species = c(
rep("dryoar",1200),
rep("dryola",1200)
)

soil = rep(
c("C","S"), 600
)

light = rep(
c(
rep("G",2), rep("U",2)
),300
)

soil_light = paste(soil, light, sep="_")

random_numbers = rnorm(2400) #for within plot randomization

master = data.frame(species, mom_id, soil, light, soil_light, random_numbers)

这将创建一个如下所示的数据框

species mom_id  soil    light   soil_light  random_numbers
dryoar 1 C G C_G 0.160598163
dryoar 1 S G S_G -0.280779835
dryoar 1 C U C_U 0.457491942
dryoar 1 S U S_U 0.643139979
dryoar 1 C G C_G -0.763162649
dryoar 1 S G S_G -1.146383360
dryoar 1 C U C_U 1.415396249
dryoar 1 S U S_U 1.103691681
dryoar 1 S U S_U 1.103691681
dryoar 1 C G C_G 1.694206627
dryoar 1 S G S_G -0.767433114
dryoar 1 C U C_U -0.570996961

我想在此数据框中添加一个新列 plot,用于分配 soil_light 列中特定 R 因子的每次出现(例如 C_U ) 在再次重复序列之前使用序列号直到设置的限制。

举例说明

soil_light  plot
C_U 1
C_U 2
C_U 3
C_U 1
C_U 2
C_U 3
C_G 1
C_G 2
C_G 3
C_G 1
C_G 2
C_G 3

我正在寻找的解决方案与找到的解决方案相似 here ,但我希望数字以 8 结尾,并针对出现的每个特定因素再次从 1 到 8 重复。

奖励:最终的解决方案当然是通过图来唯一标识每个处理组合。因此,更好的结果是:

soil_light  plot
C_U 1
C_G 9
S_U 17
S_G 25
C_U 2
C_G 10
S_U 18
S_G 26
. .
. .
. .
C_U 8
C_G 16
S_U 24
S_G 32

其中每个唯一因素都分配有一个序列号,但数字序列会随着每个新因素而变化。在上面给出的示例中,1:8 将保留给因子 C_U,9:16 保留给 C_G,17:24 保留给 S_US_G 为 25:32。

最佳答案

使用data.table:

library(data.table)
dt = as.data.table(master)

dt[, plot := 1:8, by = soil_light]

data.table 将在必要时回收,如果序列没有完美回收,您将收到警告

要获得奖金,请使用 .GRP(对组进行编号):

dt[, plot := 1:8 + (.GRP - 1) * 8, by = soil_light]

关于R:根据因子顺序分配数字到一个限制,然后重复序列直到结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com