基于频率水平的子集

时间:2014-07-18 23:36:51

标签: r subset frequency

我想生成一个df,用于选择与" ID"相关联的行。而这又与一个名为cutoff的变量相关联。对于此示例,我将cutoff设置为9,这意味着我想在df1中选择其ID值与9行以上相关联的行。我的代码的最后一行生成了一个我不明白的df。正确的df将有24行,ID列中都有3行或4行。有人可以解释我的最后一行代码实际上在做什么并建议采用不同的方法吗?

set.seed(123)
ID<-rep(c(1,2,3,4,5),times=c(5,7,9,11,13))
sub1<-rnorm(45)
sub2<-rnorm(45)
df1<-data.frame(ID,sub1,sub2)
IDfreq<-count(df1,"ID")
cutoff<-9
df2<-subset(df1,subset=(IDfreq$freq>cutoff))

3 个答案:

答案 0 :(得分:5)

可能更接近您的想法是使用ave创建频率向量:

subset(df1, ave(ID, ID, FUN = length) > cutoff)

答案 1 :(得分:4)

df1[ df1$ID %in%  names(table(df1$ID))[table(df1$ID) >9] , ]

这将测试df1 $ ID值是否属于超过9个值的类别。如果是,那么返回向量的逻辑元素将为TRUE,并且因为“i”参数将导致[ - 函数返回整行,因为“j”项为空。 / p>

见:

?`[`
?'%in%'

答案 2 :(得分:4)

使用dplyr

library(dplyr)
 df1 %>% 
 group_by(ID) %>% 
 filter(n()>cutoff)