从课程级别数据中高效找到不同同学的数量

问题描述 投票:0回答:1

我一直致力于从课程级数据库中有效计算每个学生的同学数量。

考虑这个数据框,其中每一行代表学生在给定学期内修读的课程:

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)
  )
r performance join igraph
1个回答
0
投票

这可能会占用大量内存,但希望这是朝着正确方向迈出的一步。

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
© www.soinside.com 2019 - 2024. All rights reserved.