2017-03-02 66 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)' –