我有一个非常简单的数据框,它有一个ID列和一列,用于指示该行是否为正数(1或0)。我使用plyr的每个函数按ID聚合数据,并使用agg <- aggregate(tp ~ v_id, data, each(mean, length))
计算ID的出现次数和真阳性的平均值
这似乎运作良好,我得到了以下数据:
head(agg)
v_id tp.mean tp.length
1 A51599 1.0 4
2 A51670 1.0 2
3 A51672 1.0 2
4 A51676 1.0 2
5 A51677 1.0 2
6 A51678 0.5 2
这个数据很好,但是现在我想过滤掉tp.length小于100的所有行。我用子集函数和'[]'运算符尝试了各种各样的事情。它。 tp列似乎是一个矩阵,我不知道如何到达过滤器中的tp.length。
谢谢!
答案 0 :(得分:3)
使用warpbreaks
数据以便于重现:
data(warpbreaks)
agg<-aggregate(breaks ~ wool + tension, data = warpbreaks, mean)
head(agg)
wool tension breaks
1 A L 44.55556
2 B L 28.22222
3 A M 24.00000
4 B M 28.77778
5 A H 24.55556
6 B H 18.77778
agg<-agg[agg$breaks<44,]
head(agg)
wool tension breaks
2 B L 28.22222
3 A M 24.00000
4 B M 28.77778
5 A H 24.55556
6 B H 18.77778
Hadley Wickham在这里有一个关于子集的好章节。http://adv-r.had.co.nz/Subsetting.html
您可能还想通过致电integer
numeric
还是class(agg$tp.length)
编辑:以下评论完全正确 - 当您将2个或更多函数传递给data.frame
时,它会生成类matrix
的列。这些可以是几种方式的子集:
agg = aggregate(mpg ~ am , mtcars, function(i) c(mean(i), sd(i)))
head(agg)
am mpg.1 mpg.2
1 0 17.147368 3.833966
2 1 24.392308 6.166504
str(agg)
'data.frame': 2 obs. of 2 variables:
$ am : num 0 1
$ mpg: num [1:2, 1:2] 17.15 24.39 3.83 6.17
class(agg[,2])
[1] "matrix"
您可以将单个矩阵列设置为data.frame
中的列,然后将原始答案分组。
agg$mpg1<-agg[,2][,1]
agg$mpg2<-agg[,2][,2]
head(agg)
am mpg.1 mpg.2 mpg1 mpg2
1 0 17.147368 3.833966 17.14737 3.833966
2 1 24.392308 6.166504 24.39231 6.166504