我有一个非常简单的数据框架,它有一个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。
谢谢!
发布于 2015-03-01 01:40:19
为了便于重现,使用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哈德利韦翰在这里有一个很好的一章关于减法。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.166504https://stackoverflow.com/questions/28789082
复制相似问题