2015-08-13 48 views
5

我有一個數據幀(DF)的特定值的數目象下面這樣:的R - 計數在箱

Value <- c(1,1,0,2,1,3,4,0,0,1,2,0,3,0,4,5,2,3,0,6) 
Sl <- c(1:20) 
df <- data.frame(Sl,Value)  

> df 
    Sl Value 
1 1  1 
2 2  1 
3 3  0 
4 4  2 
5 5  1 
6 6  3 
7 7  4 
8 8  0 
9 9  0 
10 10  1 
11 11  2 
12 12  0 
13 13  3 
14 14  0 
15 15  4 
16 16  5 
17 17  2 
18 18  3 
19 19  0 
20 20  6 

我想創建4米倉出df和計數的Value=0由分組的出現Sl值在一個單獨的數據幀象下面這樣:

Bin Count 
1 1 
2 2 
3 2 
4 1 

我試圖用tablecut創造欲的數據幀,但其並不清楚如何我會指定df$Value和邏輯找到0這兒

df.4.cut <- as.data.frame(table(cut(df$Sl, breaks=seq(1,20, by=5)))) 
+0

你的樣品輸入和輸出不匹配。你能清理你的問題嗎? –

+0

'cut'和'tapply'。 – mts

+0

@TimBiegeleisen我已經更新了這個問題 – joarderm

回答

3

使用您的df

tapply(df$Value, cut(df$Sl, 4), function(x) sum(x==0)) 

> tapply(df$Value, cut(df$Sl, 4), function(x) sum(x==0)) 
(0.981,5.75] (5.75,10.5] (10.5,15.2] (15.2,20] 
      1   2   2   1 

cut您可以指定符的數量或中斷本身,如果你喜歡和邏輯在tapply

+1

這工作!我只是修改'cut'爲 tapply(df $ Value,cut(df $ Sl,breaks = seq(0,20,by = 5)),function(x)sum(x == 0)) – joarderm

+0

或者,你可以使用'table()':'table(cut(df $ Sl,breaks = seq(0,20,by = 5)),df $ Value == 0)'。 –

2

或使用data.table,我們將'data.frame'轉換爲'data.table'(setDT(df)),使用cut輸出作爲分組變量,我們得到sum的'Value'爲'0'(!Value)。通過否定(!),該列將更加回旋的方式使用sqldf被轉換爲邏輯矢量即TRUE爲0和FALSE所有其它值不等於0。

library(data.table) 
setDT(df)[,sum(!Value) , .(gr=cut(Sl,breaks=seq(0,20, 5)))] 
#  gr V1 
#1: (0,5] 1 
#2: (5,10] 2 
#3: (10,15] 2 
#4: (15,20] 1 
1

首先我們創建一個表限定倉和範圍(最小值和最大值):

bins <- data.frame(id = c(1, 2, 3, 4), 
        bins = c("(0,5]", "(5,10]", "(10,15]", "(15,20]"), 
        min = c(0, 6, 11, 16), 
        max = c(5, 10, 15, 20)) 

    id bins min max 
1 1 (0,5] 0 5 
2 2 (5,10] 6 10 
3 3 (10,15] 11 15 
4 4 (15,20] 16 20 

然後我們使用同時​​使用表來倉的每個sl以下查詢成使用0123其各自的組對於那些Value等於0

library(sqldf) 
sqldf("SELECT bins, COUNT(Value) AS freq FROM df, bins 
     WHERE (((sl) BETWEEN [min] AND [max]) AND Value = 0) 
     GROUP BY bins 
     ORDER BY id") 

輸出:

 bins freq 
1 (0,5] 1 
2 (5,10] 2 
3 (10,15] 2 
4 (15,20] 1 

另一種替代方法,以簡化利用cut MTS建議箱的結構,在提取因子的levels

bins <- data.frame(id = 1:4, 
        bins = levels(cut(Sl, breaks = seq(0, 20, 5))), 
        min = seq(1, 20, 5), 
        max = seq(5, 20, 5)) 
+1

有趣的解決方案,+1。可能你可以用'cut'來簡化'bin'的結構,就像其他答案中所用的那樣,即'cut(Sl,breaks = seq(0,20,5))'? – mts

+0

@ mts我編輯它以包含您的建議。謝謝! – mpalanco

2

您的問題使用table(),但它缺少第二個參數。需要生成一個應急表。您可以找到每個倉與統計:

table(cut(df$Sl,4),df$Value) 

      0 1 2 3 4 5 6 
(0.981,5.75] 1 3 1 0 0 0 0 
(5.75,10.5] 2 1 0 1 1 0 0 
(10.5,15.2] 2 0 1 1 1 0 0 
(15.2,20] 1 0 1 1 0 1 1 

Value == 0每個箱計數:

table(cut(df$Sl,4),df$Value)[,"0"] 

(0.981,5.75] (5.75,10.5] (10.5,15.2] (15.2,20] 
      1   2   2   1