根据取决于分组变量的条件选择观察

时间:2014-02-20 06:07:02

标签: r

我有一个问题,我希望有人会帮我回答。我有一个由寄生虫和年份排序的数据集,看起来像这样(实际的数据集要大得多):

    parasites      year       samples      
    1000          2000        11  
    910           2000        22          
    878           2000        13  
    999           2002        64
    910           2002        75  
    710           2002        16  
    890           2004        29  
    810           2004        10  
    789           2004         9  
    876           2005        120   
    750           2005         12  
    624           2005        157  

我想做的是,每年,我想选择寄生虫数量最多的2个样本,给我一个看起来像这样的输出:

    parasites      year        samples    
    1000           2000         11   
    910            2000         22  
    999            2002         64  
    910            2002         75  
    890            2004         29  
    810            2004         10  
    876            2005        120  
    750            2005         12

我是整个编程的新手,仍然试图找到我的方式R.有人可以向我解释我将如何解决这个问题?非常感谢。

2 个答案:

答案 0 :(得分:1)

data.table

怎么样?
parasites<-read.table(header=T,text="parasites     year      samples
1000          2000        11
910           2000        22
878           2000        13
999           2002        64
910           2002        75
710           2002        16
890           2004        29
810           2004        10
789           2004         9
876           2005        120
750           2005         12
624           2005        157")

编辑 - 抱歉按寄生虫分类,而非样本

require(data.table)
data.table(parasites)[,.SD[order(-parasites)][1:2],by="year"]

注意.SDyear

中设置的每个by=值的子表
year parasites samples
1: 2000      1000      11
2: 2000       910      22
3: 2002       999      64
4: 2002       910      75
5: 2004       890      29
6: 2004       810      10
7: 2005       876     120
8: 2005       750      12

答案 1 :(得分:1)

这是一个R-base解决方案(如果您需要):

data = data.frame("parasites"=c(1000,910,878,999,910,710,890,910,789,876,750,624),
                  "year"=c(2000,2000,2000,2002,2002,2002,2004,2004,2004,2005,2005,2005),
                  "samples"=c(11,22,13,64,75,16,29,10,9,120,12,157))

data = data[order(data$year,data$samples),]

data_list = lapply(unique(data$year),function(x) (tail(data[data$year==x,],n=2)))

final_data = do.call(rbind, Map(as.data.frame,data_list))

希望有所帮助!