使用R中的Matrix列过滤数据框

时间:2015-03-01 01:31:55

标签: r

我有一个非常简单的数据框,它有一个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。

谢谢!

1 个答案:

答案 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