【发布时间】:2015-07-01 22:36:11
【问题描述】:
我有两个数据框:
set.seed(343)
testDF <- data.frame(Score = sample(50, size=50, replace=TRUE), number = rep(letters[1:25],2), Rev = rep(0,50))
sourceDF <- data.frame(min = c(1,10,20,30,40), max = c(9, 19, 29, 39, 50), rev = 1:5)
对于testDF中testDF$score在sourceDF的sourceDF$min和sourceDF$max之间的每一行,将testDF$Rev的值替换为对应的sourceDF$rev。
我让它与两个 for 循环和一个 if 条件一起工作,但它...慢(我的数据集有接近 100 万行)。 我尝试使用 findInterval 没有成功。
有没有更好/更有效的方法来做到这一点?
【问题讨论】:
-
letter是什么?另外,使用rnorm时请使用set.seed。最后,您的示例不太好,因为Score永远不会大于9,因此它永远不会落入除第一个之外的任何桶中。我会改用sample。 -
您的示例无法运行。没有称为“字母”的函数。使用 which() 和/或 apply 系列可能会找到更快的解决方案。
-
@TanDollars
applyfamily 不会有任何改善。which在这里不太适合 AFIK。 -
我想答案会在'which()'中找到
-
9.5会在哪些数据上出现?它 > 9,所以不在第 1 组,但 Score 数据是一组离散整数还是连续度量?