计算向量中超过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