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

时间:2016-05-21 20:50:02

标签: r dataframe filter count

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

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

换句话说,如果个别= x的行少于5行,那么我想删除包含单个x的所有行,并将结果重新分配给新的data.frame。我知道一些使用类似names == unique(df$individualname)之类的强力技术,然后单独对这些名称进行分组并应用nrow来确定是否排除它们......但必须有一个更好的方法。感谢任何帮助,我对R来说还是一个新手。

3 个答案:

答案 0 :(得分:5)

使用log(n!)包中的log(f(n))n的示例:

public function findMax( o:Object ):String {
    var lowest:Number = Number.MAX_VALUE;
    var lowestLabel:String;
    for (var label:String in o) {
        var val:Number = o[label];
        if ( val != null && val < lowest ) {
            lowest = val;
            lowestLabel = label;
        }
    }
    return lowestLabel;
}

或与基础R:

group_by

仍然在基础R中,使用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

答案 1 :(得分:2)

使用override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "detail" { let playerDetailScreen = segue.destinationViewController as! PlayerDetailViewController let selectedPlayer = sender as! Player playerDetailScreen.name = self.selectedPlayer.name playerDetailScreen.height = self.selectedPlayer.height ... so on. // So, remember to create property for each name, height, etc. // inside playerDetailScreen // This is how you can transfer data } } 包执行相同操作的另一种方法。

data.table

答案 2 :(得分:2)

在{id'分组后,data.table也可以使用if的逻辑条件

library(data.table)
setDT(df)[, if(.N >=5) .SD, id]
#  id       foo
# 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

数据

df <- structure(list(id = c("a", "a", "b", "b", "b", "b", "b", "c", 
"c", "c", "c", "c", "c", "c", "c"), foo = c(0.8717067, 0.9086262, 
0.9962453, 0.8980123, 0.1535324, 0.2802848, 0.9366375, 0.8109557, 
0.6945285, 0.1012925, 0.6822955, 0.3757085, 0.7348635, 0.3026395, 
0.9707223)), .Names = c("id", "foo"), class = "data.frame", 
row.names = c(NA, -15L))