【问题标题】:R: sequentially assign number based on factor to a limit, then repeating sequence until endR:根据因子顺序分配数字到一个限制,然后重复序列直到结束
【发布时间】:2014-07-15 20:57:16
【问题描述】:

我正在尝试根据独特的治疗组合分配图。

以下代码将生成我要创建的数据工作表:

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 列(例如 C_U)中特定 R 因子的每个外观分配一个序列号,直到重复之前的设定限制又是一个序列。

为了说明

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_U,25:32 保留给 S_G

【问题讨论】:

    标签: r


    【解决方案1】:

    使用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]
    

    【讨论】:

    • 太美了。你对我的奖金目标有什么想法吗?还是问一个新问题会更好,因为它可能不那么容易解决?
    • @Rewarp tbh 我真的不明白“奖励目标”——你可能想要dt[, list(plot = 1:8), by = soil_light]
    • 我希望能够仅从地块编号轻松跟踪我的治疗组合。初始设置允许我通过将soil_light 向量与plot 向量配对来跟踪绘图。相反,如果我只能将 1:8 分配给 C_U,将 9:16 分配给 C_G,以 8 为增量,直到 soil_light 的所有唯一标识符都用完,那将是理想的。
    • 成功了。言语无法形容我对这个解决方案的满意程度。谢谢。您介意解释一下+ (.GRP - 1) * 8 的作用吗?它不像以前的解决方案那样直观易懂。
    • @Rewarp great :) .GRP 从 1 开始对组进行编号,因此表达式变为第一组的 1:8 + 0,第二组的 1:8 + 8,等等
    猜你喜欢
    • 2020-10-11
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多