2015-01-06 37 views
1

設說我有一個數據幀由一個變量(x)對於環和存儲結果的作爲R的陣列

df <- data.frame(x=c(1,2,3,3,5,6,7,8,9,9,4,4)) 

我想知道有多少數字是小於2,3, 4,5,6,7。 我知道如何使用for循環或其他方法(或多個)做到這一點使用手動

# This will tell you how many numbers in df less than 4 
xnew <- length(df[ which(df$x < 4), ]) 

我的問題是我怎麼能自動化呢?我需要存儲在數組中的結果超過(sapply)數目如下

i length 
2 1 
3 2 
4 4 
5 6 
6 7 
7 8 

由於

回答

3

一種方式將是對環路(2:7),檢查哪些元素在df$x小於(< )中的「數量」和做sumcbind與數字,會給matrix輸出

res <- cbind(i=2:7, length=sapply(2:7, function(y) sum(df$x <y))) 

或者您也可以通過矢量化CRE將matrix的數字(2:7)與每個數字複製的行數df進行邏輯運算<df$x。對矩陣的每一列重複邏輯操作,並使用colSums獲得列總和。

length <- colSums(df$x <matrix(2:7, nrow=nrow(df), ncol=6, byrow=TRUE)) 

#or 
#length <- colSums(df$x < `dim<-`(rep(2:7,each=nrow(df)),c(12,6))) 
cbind(i=2:7, length=length) 
+0

謝謝,但我怎麼能存儲我呢?我= 2,3,4,5,6,7。 – user9292

1
num = c(2,3,4,5,6,7) 
res = sapply(num, function(u) length(df$x[df$x < u])) 

data.frame(number=num, 
      numberBelow=res) 
1

矢量化的解決方案:

findInterval(2:7*(1-.Machine$double.eps),sort(df$x)) 

.Machine$double.eps部分確保你正在服用的只是低於不低於或高於同等的數字。