计算向量中超过data.frame列中值的值数

计算向量中超过data.frame列中值的值数,r,dataframe,R,Dataframe,我有一长串数字,例如 set.seed(123) y<-round(runif(100, 0, 200)) 我可以手动计算数字,如下所示: length(which(y>=20)) #93 values exceed 20 length(which(y>=40)) #81 values exceed 40 df x y 1 0 100 2 20 93 3 40 81 4 60 70 5 80 61 6 100 47 7 120 4

我有一长串数字,例如

 set.seed(123)
 y<-round(runif(100, 0, 200))
我可以手动计算数字,如下所示:

length(which(y>=20)) #93 values exceed 20
length(which(y>=40)) #81 values exceed 40
df
     x   y
1  0 100
2  20  93
3  40  81
4  60  70
5  80  61
6  100  47
7  120  40
8  140  29
9  160  19
10 180   8
11 200   0
等等,我知道我可以用一个for循环来处理所有的x值,但是有没有更优雅的方法呢

我试过这个:

 df$y <- length(which(y>=df$x))

您可以使用
sapply
df$x的每个值与
y的所有值进行比较

sapply(df$x, function(a) sum(y>a))
#[1] 99 93 81 70 61 47 40 29 18  6  0

#Looking at your output, maybe you want
sapply(df$x, function(a) sum(y>=a))
#[1] 100  93  81  70  61  47  40  29  19   8   0
下面是另一种使用
outer
的方法,它允许对两个向量进行元素级比较

rowSums(outer(df$x,y, "<="))
#[1] 100  93  81  70  61  47  40  29  19   8   0

另一个想法是,为了避免所有比较和许多求和的all,findInterval
对于此类任务非常方便--
length(y)-findInterval(df$x,sort(y),left.open=TRUE)
rowSums(outer(df$x,y, "<="))
#[1] 100  93  81  70  61  47  40  29  19   8   0
length(y) - findInterval(df$x, sort(y), left.open = TRUE)
# [1] 100  93  81  70  61  47  40  29  19   8   0