我一直致力于从课程级数据库中有效计算每个学生的同学数量。
考虑这个数据框,其中每一行代表学生在给定学期内修读的课程:
dat <-
data.frame(
student = c(1, 1, 2, 2, 2, 3, 4, 5),
semester = c(1, 2, 1, 2, 2, 2, 1, 2),
course = c(2, 4, 2, 3, 4, 3, 2, 4)
)
# student semester course
# 1 1 1 2
# 2 1 2 4
# 3 2 1 2
# 4 2 2 3
# 5 2 2 4
# 6 3 2 3
# 7 4 1 2
# 8 5 2 4
学生将在给定学期内学习课程。他们的同学是同一学期参加同一课程的其他学生。例如,在两个学期中,学生 1 有 3 个同学(学生 2、4 和 5)。
如何获得每个学生在两个学期中拥有的独特同学的数量?所需的输出将是:
student n
1 1 3
2 2 4
3 3 1
4 4 2
5 5 2
其中
n
是学生在学年期间拥有的不同同学数量的值。
我感觉
igraph
解决方案可能有效(因此有了标签),但我对这个包的了解太有限。我也觉得使用 joins
可以有所帮助,但同样,我不确定如何。
重要的是,我希望它适用于更大的数据集(我的数据集大约有 1700 万行)。这是一个示例数据集:
set.seed(1)
big_dat <-
data.frame(
student = sample(1e4, 1e6, TRUE),
semester = sample(2, 1e6, TRUE),
course = sample(1e3, 1e6, TRUE)
)
这可能会占用大量内存,但希望这是朝着正确方向迈出的一步。
library(data.table)
library(tictoc)
tic()
# Assume 1-n ids for the students
dat <- big_dat
n <- max(dat$student)
classmate <- matrix(FALSE, nrow=n, ncol=n)
setDT(dat)
grps <- dat[, .(list(student)), .(semester,course)][, V1]
for (g in grps) {
for (i in g) {
classmate[i, g] <- TRUE
}
}
# if -1 student not present
data.table(student = seq_len(n), n = rowSums(classmate)-1)
toc()
# 6.48 sec elapsed