And*_*ade 4 r count filter dataframe
为了澄清这个问题,我将简要描述数据。
中的每一行data.frame
都是一个观察值,各列代表与该观察值相关的变量,包括:观察到的个体,观察的时间,观察的位置等。我想排除/过滤少于5个个体观察。
换句话说,如果少于5行,其中personal = x,那么我想删除包含个别x的所有行,并将结果重新分配给new data.frame
。我知道有些类似的蛮力技术names == unique(df$individualname)
,然后分别将这些名称细分,然后应用nrow
以确定是否排除它们……但是必须有一种更好的方法。感谢您的帮助,对于R我还是很陌生。
使用例如group_by
与filter
从dplyr
包:
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)