如何在R中使用大于等于#的较大数据帧的等长行创建新数据帧?

时间:2015-11-26 16:56:50

标签: r

我开始使用大型数据框(828行×9列),这些数据框与土狼和随机位置使用的位置的植被测量有关。我使用ddplyCoyote IDRandom(Y或N)和观察次数(nrow)排列数据。

几行看起来像这样:

COYOTID    Random     nrow
1 Y 28
1 N 28
2 Y 16
2 N 12
3 Y 8
3 N 8

我希望R告诉我哪个ID在某个阈值之上有相同数量的观察值(比方说28:在这个例子中只有ID 1)。然后我想从原始数据框创建一个新的数据框,只保留包含这些ID的行。我怎样才能做到这一点?到目前为止我所看到的一切(我通常被引导到lapply)处理将完整列操作为“子集”而不是子集的子集。

1 个答案:

答案 0 :(得分:0)

我们可以尝试使用data.table。我们将'data.frame'转换为'data.table'(setDT(df)),按'COYOTID'分组,我们获得.I length的行索引(unique) 'nrow'中的元素是1(uniqueN是它的包装器),并且该值大于或等于28.使用此行索引列,我们对行进行子集化。

 library(data.table)#v1.9.6+
 setDT(df)[df[, .I[uniqueN(nrow)==1 & nrow>=28], by = COYOTID]$V1]
 #     COYOTID Random nrow
 #1:       1      Y   28
 #2:       1      N   28

或者我们可以使用dplyr类似的方法。

 library(dplyr)
 df %>% 
   group_by(COYOTID) %>%
   filter(n_distinct(nrow)==1 & nrow >=28)
 # COYOTID Random  nrow
 #    (int)  (chr) (int)
 #1       1      Y    28
 #2       1      N    28