这是基于我想做的mtcars
的模型:
disp
)am
)try1
是findInterval
函数的一次尝试,问题是我无法计算依赖于类别的子集(am
)我已经尝试过使用*apply
的解决方案,但是我无法在某种程度上永远不能使这个函数只在依赖于处理行的变量值的子集上工作(希望这是有意义的)。
x = mtcars[1:6,c("disp","am")]
# expected values are the number of cars that have less disp while having the same am
x$expected = c(1,1,0,1,2,0)
#this ordered table is for findInterval
a = x[order(x$disp),]
a
# I use the findInterval function to get the number of values and I try subsetting the call
# -0.1 is to deal with the closed intervalq
x$try1 = findInterval(x$disp-0.1, a$disp[a$am==x$am])
x
# try1 values are not computed depending on the subsetting of a
任何解决方案都可以;使用findInterval
函数不是强制性的。
我宁愿有一个更通用的解决方案,通过调用一个从当前行获取值来计算预期值的函数来计算列值。
答案 0 :(得分:4)
正如@dimitris_ps所指出的,之前的解决方案忽略了重复的计数。以下提供了补救措施。
library(dplyr)
x %>%
group_by(am) %>%
mutate(expected=findInterval(disp, sort(disp) + 0.0001))
或
library(data.table)
setDT(x)[, expected:=findInterval(disp, sort(disp) + 0.0001), by=am]
答案 1 :(得分:3)
基于@Khashaa的逻辑,这是我的方法
library(dplyr)
mtcars %>%
group_by(am) %>%
mutate(expected=match(disp, sort(disp))-1)