2017-03-02 35 views
2

我有一长串数字,例如,计算向量中超过data.frame的值中的值的数量

set.seed(123) 
y<-round(runif(100, 0, 200)) 

而且我想在y列来存储超过在数据帧的x列中的每个值的值的数目:

df <- data.frame(x=seq(0,200,20)) 

我可以手动计算的数字,这样的:

length(which(y>=20)) #93 values exceed 20 
length(which(y>=40)) #81 values exceed 40 

等我知道我可以使用for循环与x的所有值,但有没有更优雅的方式?

我尝试这样做:

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

但是,这给出了一个警告,不给我所需的输出。

数据帧应该是这样的:

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 

回答

2

可以使用sapply

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另一种方法,允许单元方式比较df$x每个值对的y所有值两个载体的比较

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

然而,一个多(从alexis_laz的评论)

length(y) - findInterval(df$x, sort(y), left.open = TRUE) 
# [1] 100 93 81 70 61 47 40 29 19 8 0 
+0

作为另一个想法,以避免全用,所有的比较和许多求和,'findInterval'是非常方便的这样的任务 - '长度(Y) - findInterval(df $ x,sort(y),left.open = TRUE)' –