r - 优化每行数据表的调用函数

标签 r data.table

我们需要优化一个程序来对每个“nb_student”进行处理 根据值编号,生成与输入的值相对应的列表编号。 一旦得到这个列表,另一个程序就必须按照排名规则进行计数。

排序规则

如果学生人数:

  • 小于 1 => 递增 A 组
  • 在 1 和 3 之间 => 增加 B 组
  • 在 3 和 4 之间 => 增加组 C
  • 大于 4 => 递增组 D

初始数据

  "category_name" "nb_student"    
    A                   6,00000
    A                   10,00000            
    B                   12,0000         
    C                   74,0000     
    D                   6,00000 

初始化数据代码

DT = data.table(
      category_name = c("A","B","C","D"),
      nb_student = c(6,12,74,6)
    )

每一行的函数

treatment_group <- function(nb_student){
    nb_group_A =  nb_group_B = nb_groupe_C = nb_groupe_D <- 0
    
    limit_1 <- 1
    limit_2 <- 3
    limit_3 <- 4
    
    list <- runif(nb_student, 0, 5)
    
    for (i in list) {
    if(i < limit_1){
      nb_group_A <- nb_group_A + 1
    }else if(i > limit_1 & i < limit_2){
      nb_group_B <- nb_group_B + 1
    }else if(i > limit_3){
      nb_groupe_C <- nb_groupe_C + 1
    }else {
      nb_groupe_D <- nb_groupe_D + 1
    }
  }

  list(nb_group_A, nb_group_B, nb_groupe_C, nb_groupe_D)
}

结果

DT[ , c("group A", "group B", "group C", "group D") := tratment_group(nb_student), by = seq_len(nrow(DT))]

最后的结果一定要和这张表匹配

"category_name" "nb_student"           "group A"       "group B"       "group C"     "group D"
       A             6,00000            0,00000         2,00000         4,00000       0,00000
       A             10,00000           3,00000         3,00000         4,00000       0,00000
       B             12,0000            2,00000         9,00000         0,00000       1,00000
       C             74,0000            14,0000         29,0000         15,0000       16,0000
       D             6,00000            0,00000         1,00000         3,00000       2,00000

此代码有效,但我想优化它以运行 200000 行。也许使用并行化?

最佳答案

我猜你可以试试 findInterval

set.seed(1)
DT[
  ,
  c(
    .SD,
    as.data.frame(
      t(as.matrix(table(
        factor(
          findInterval(runif(nb_student, 0, 5), c(1, 3, 4)) + 1,
          levels = 1:4,
          label = paste("group", LETTERS[1:4])
        )
      )))
    )
  ),
  category_name
]

给出

   category_name nb_student group A group B group C group D
1:             A          6       0       4       0       2
2:             B         12       2       3       5       2
3:             C         74      11      35      17      11
4:             D          6       0       2       3       1

关于r - 优化每行数据表的调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74241285/

相关文章:

r - 在 data.table 对象中显示行名称

r - 如何从 data.table 构建外积矩阵

r - 我在 data.table 中复制行的方法有效吗?

r - 在 R 中选择没有缺失值的行

r - 向直方图和累积直方图添加密度线

r - R中的vi输入模式?

list - R:将列表打印到文本文件

r - 如何在嵌套函数中将所有可能的内容传递给 i、j 和 by?

r - 多元回归遗漏一个变量(列)

R data.table 将函数应用于所有列对