如何从数据框中删除少于5个观察值的个体

And*_*ade 4 r count filter dataframe

为了澄清这个问题,我将简要描述数据。

中的每一行data.frame都是一个观察值,各列代表与该观察值相关的变量,包括:观察到的个体,观察的时间,观察的位置等。我想排除/过滤少于5个个体观察。

换句话说,如果少于5行,其中personal = x,那么我想删除包含个别x的所有行,并将结果重新分配给new data.frame。我知道有些类似的蛮力技​​术names == unique(df$individualname),然后分别将这些名称细分,然后应用nrow以确定是否排除它们……但是必须有一种更好的方法。感谢您的帮助,对于R我还是很陌生。

Vin*_*mme 6

使用例如group_byfilterdplyr包:

library(dplyr)
df <- data.frame(id=c(rep("a", 2), rep("b", 5), rep("c", 8)),
           foo=runif(15))

> df
id       foo
1   a 0.8717067
2   a 0.9086262
3   b 0.9962453
4   b 0.8980123
5   b 0.1535324
6   b 0.2802848
7   b 0.9366375
8   c 0.8109557
9   c 0.6945285
10  c 0.1012925
11  c 0.6822955
12  c 0.3757085
13  c 0.7348635
14  c 0.3026395
15  c 0.9707223

df %>% group_by(id) %>% filter(n()>= 5) %>% ungroup()
Source: local data frame [13 x 2]

id       foo
(fctr)     (dbl)
1       b 0.9962453
2       b 0.8980123
3       b 0.1535324
4       b 0.2802848
5       b 0.9366375
6       c 0.8109557
7       c 0.6945285
8       c 0.1012925
9       c 0.6822955
10      c 0.3757085
11      c 0.7348635
12      c 0.3026395
13      c 0.9707223
Run Code Online (Sandbox Code Playgroud)

或使用基数R:

> df[df$id %in% names(which(table(df$id)>=5)), ]
id       foo
3   b 0.9962453
4   b 0.8980123
5   b 0.1535324
6   b 0.2802848
7   b 0.9366375
8   c 0.8109557
9   c 0.6945285
10  c 0.1012925
11  c 0.6822955
12  c 0.3757085
13  c 0.7348635
14  c 0.3026395
15  c 0.9707223
Run Code Online (Sandbox Code Playgroud)

仍然在R语言中,使用with是一种更优雅的方法来执行相同的操作:

df[with(df, id %in% names(which(table(id)>=5))), ]
Run Code Online (Sandbox Code Playgroud)

要么:

subset(df, with(df, id %in% names(which(table(id)>=5))))
Run Code Online (Sandbox Code Playgroud)