2016-11-11 27 views
4

我希望找到每個主題每天的值大於11的行數,並將它們輸出到數據框中分析。數據集很大(5000行),所以需要一個功能。計算高於閾值的數據幀中的行數作爲函數或其他列因子

subject = c(rep("A", 12), rep("B", 12))   
day = c(1,1,1,1,2,2,2,2,3,3,3,3,1,1,1,1,2,2,2,2,3,3,3,3) 
value = c(13,14,15,5,12,9,6,14,4,2,1,2,13,14,15,5,12,9,6,14,2,2,2,3) 
df = data.frame(subject, day, value) 
df 

    subject day value 
1  A 1 13 
2  A 1 14 
3  A 1 15 
4  A 1  5 
5  A 2 12 
6  A 2  9 
7  A 2  6 
8  A 2 14 
9  A 3  4 
10  A 3  2 
11  A 3  1 
12  A 3  2 
13  B 1 13 
14  B 1 14 
15  B 1 15 
16  B 1  5 
17  B 2 12 
18  B 2  9 
19  B 2  6 
20  B 2 14 
21  B 3  2 
22  B 3  2 
23  B 3  2 
24  B 3  3 

我想輸出是

subject.agg = c(rep("A", 3), rep("B", 3)) 
day.agg = as.factor(c(1,2,3,1,2,3)) 
highvalues = (c(3,2,0,3,2,0)) 
df.agg = data.frame(subject.agg,day.agg,highvalues) 
df.agg 

    subject.agg day.agg highvalues 
1   A  1   3 
2   A  2   2 
3   A  3   0 
4   B  1   3 
5   B  2   2 
6   B  3   0 

任何幫助非常將會非常讚賞。

+0

非常感謝。 DT解決方案對我來說非常合適。 – MLyall

回答

6

一種選擇是從aggregatebase R

aggregate(cbind(highvalues=value>11)~., df, sum) 

或用data.table

library(data.table) 
setDT(df)[value>11, .(highvalues=.N), by = .(subject, day)] 
#  subject day highvalues 
#1:  A 1   3 
#2:  A 2   2 
#3:  A 3   3 
#4:  B 1   3 
#5:  B 2   2 
#6:  B 3   3 
+0

這很好,非常感謝。無論如何,我可以在輸出科目中包括沒有超過11的值的日子。即,對於科目A,第四天沒有超過11的值,它會讀取A 4 0?謝謝!! – MLyall

+0

@MLyall您可以更新您的文章,瞭解您對期望輸出的期望 – akrun

+0

@MLyall您可以使用'subject','day'的所有獨特組合或使用'if/else'做一個'join'感謝 – akrun

1
library(data.table) 
dt = setDT(df) 
dt[, sum(value>11),by = .(subject,day)] 
    subject day V1 
1:  A 1 3 
2:  A 2 2 
3:  A 3 3 
4:  B 1 3 
5:  B 2 2 
6:  B 3 3 
2

你可以去tidyverse方式:

df %>% 
    filter(value > 11) %>% 
    group_by(subject,day) %>% 
    mutate(highvalue = n()) %>% 
    select(subject, day, highvalue) %>% 
    unique() 
相關問題