2016-11-11 29 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() 
相关问题