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

标签 r

我正在尝试根据独特的处理组合分配地 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/

相关文章:

r - 如何将 Shiny 中生成的 react 图传递给 Rmarkdown 以生成动态报告

r - 如何将多个 ggplot2 元素组合到函数的返回中?

r - 按计数子集

r - 对绘图中的区域进行注释/标记

R:以编程方式将 ggplot 刻度标签更改为带有表达式的希腊字母

r - 根据方面的存在有条件地修改ggplot主题?

按组保留行,直到在列中首次出现值为止。没有值(value)的团体

R 计算平均购买价格

r - R 中的 data.frame(cbind...) 与 data.frame(...)

string - 用 Latex 代码替换字符串向量中的重音符号