我正在为一系列多项选择题考试计算项目统计信息。 我有一个使用mapply的解决方案,该解决方案在技术上是可行的,但是要计算一个更复杂的统计信息需要花费几个小时。 我拥有的第一个数据集是针对每个学生针对每次评估回答的每个问题单独包含一行的数据集。

df <- data.frame(c(rep("s1", 5), rep("s2", 5), rep("s3", 5),rep("s4", 5)),"a1", c("i1", "i2", "i3", "i4", "i5"), c(1, 0), 1)

colnames(df) <- c("student", "assessment", "item", "score", "points.possible")

我要做的第一步(只有一次)是创建一个包含所有唯一项的表。 在这种情况下,这很简单,因为只有一个评估和5个项目。

unique <- subset(df[,c("assessment", "item")], !duplicated(df[,c("assessment", "item")]))

然后,我需要为这些项目中的每一项计算统计信息。 但是,棘手的部分是计算需要计算学生在整个评估中获得的总分。 这是我为此编写的函数。

fun1 <- function(a.id, i.id) {
  # subset original dataframe for just one assessment
  subsetdf <- df[df$assessment == a.id,]

  # generate list of students that got the item right and wrong
  correct <- subsetdf$student[subsetdf$item==i.id & subsetdf$score==1]
  wrong <- subsetdf$student[subsetdf$item==i.id & subsetdf$score==0]

  # scores by student
  scores <- aggregate(score ~ student, data=subsetdf,sum)/aggregate(points.possible ~ student, data=subsetdf, sum)  

  # average scores for students that got item right/wrong
  x.1 <- sum(subsetdf$score[subsetdf$student %in% correct])/sum(subsetdf$points.possible[subsetdf$student %in% correct])
  x.0 <- sum(subsetdf$score[subsetdf$student %in% wrong])/sum(subsetdf$points.possible[subsetdf$student %in% wrong])

  # percent of students that got item right
  p <- length(correct)/(length(correct)+length(wrong))

  # final stat calculation
  r <- ((x.1-x.0)*sqrt(p*(1-p)))/sd(scores[,2])
  print(r)
}

然后,我使用mapply在整个原始数据集上循环使用此函数,同时使用较小的数据集作为输入。

unique$r <- mapply(fun1, unique$assessment, unique$item)

我很高兴能够使它工作,但是当我使用更大的数据集(“ df”使用约700万行,“唯一”使用约2000行)时,则需要花费一些时间(几个小时)。关于解决该问题的其他更有效方法的任何技巧吗?我知道一个问题是我的函数每次循环时都会为原始大型数据集创建一个副本,但我不知道该怎么做没有那个。

我仍然认为自己是R这类用法的初学者,因此任何建议将不胜感激!

#1楼 票数:0

当你表演

scores <- aggregate(score ~ student, data=subsetdf,sum)/aggregate(points.possible ~ student, data=subsetdf, sum)  

结果不是严格的数字,结果是一个数据帧(例如,对于a.id = 'a1', i.id = 'i1' ):

> aggregate(score ~ student, data=subsetdf,sum)
      student score
1      s1     3
2      s2     2
3      s3     3
4      s4     2

因此,当您将二者's1'/'s1''s1'/'s1'的结果不是数字,并引发警告。

  1. 没有必要制造correctwrong 将该列的值视为指示该学生是对还是错的指标。

而是,请执行以下操作:

scores <- aggregate(subsetdf[,c('score', 'points.possible')], by = list(subsetdf$student), sum)
names(scores) <- c('student', 'score','points.possible')
scores$avg.score <- scores$score/scores$points.possible

我会对x.0x.1做同样的x.0 如果您通过i.id创建一个子集,然后聚合该数据帧的子集,这还可以节省一些步骤。 您要为每个学生两次检查他们是否correctwrong (对于scorepoints.possible ),这一事实也非常昂贵。

  ask by sam.b translate from so

未解决问题?本站智能推荐:

1回复

通过行迭代在mapply上实现data.table函数

我有一个数据框 我想使用按行伪公式计算列 当前方法 #结果- DF1 对于140万行的数据帧,此方法花费6分钟。 因此,我想更改data.table的方法,该方法应该花费较少的时间,因为不会创建副本。 到目前为止,这是我已经实现的目标- 但这会引发很多警告,例如-
1回复

R按顺序运行回归

########################## 我想知道,如何使用某种函数运行所有这些回归? 基本上,回归在 COVS1 上回归“alpha”,然后在 COVS1 和 COVS2 上回归“alpha”,然后在 COVS1、COVS2 和 COVS3 上回归“alpha”。 这是针对整个数据
1回复

使用mapply以列名作为参数生成图

感兴趣的数据在mymeanDT 我需要按yearmonth和mydummy为所有列绘制线条。 我可以通过以下方式做到这一点 我想在标题中使用列名。 所以我尝试通过mapply传递一个类似的函数 但这是我得到的输出 任何帮助将非常感激
1回复

将向量与大型data.table合并以执行计算的内存高效方法(R)

我有一个数据集,其中包含由多个模型预测的基于年份的数据,采用 data.table 格式。 我需要从这个数据集中执行一组计算,这个向量基于一个名为x的向量,长度为 1001 并且包含在seq(-2, 8, by=0.01) 。 为此,我创建了一个新的 data.table ( dt ),其中包含重复
1回复

有没有一种更有效的内存使用方式,可以使用combn从R中的其他每一列中减去每一列?

我正在尝试从具有13125列和90行的大型R data.table中的每一列中减去每一列。 我正在跟踪先前的问题,该问题针对较小尺寸的data.tables解决此问题( 从R data.table中的其他列中减去每一列 )。 我的问题是我当前内存不足以生成列组合的data.table结果
3回复

Rdata.table列名在函数中不起作用

我正在尝试在函数中使用 data.table,并且我试图了解为什么我的代码失败。 我有一个 data.table 如下: 我正在尝试使用不同的“my_id”值创建所有对“my_name”,对于 DT,这将是: 我有一个函数可以为给定的“my_id”值对返回所有“my_name”对,它按预期工作。 现
1回复

Rdata.tableapply函数在所有行上具有多列输入,并获得合理的输出

我正在尝试将一个函数应用于data.table的所有行,同时使用多列作为输入,其输出可能是data.frame / matrix /每行你拥有一两行。 我的data.table有800,000行。 这是我最接近的尝试。 当然,这里发挥的作用是正确性,效率和对输出结构的易用性。 关于如
1回复

将Data.Tables(R)与循环或映射组合

我是 R 中数据表的新手,并且通过我的分析已经成功完成了 80%。 背景是我想得到一只股票5天(前后)的回报,然后是他们报告后的25天和45天。 我已经成功地在一组日期(有效地硬编码)上做到了,但是当我尝试自动化该过程时,它就崩溃了。 我将从我目前的公式开始,然后解释数据。 此公式成功查看数据表并返