我们需要优化一个程序来对每个“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/