【问题标题】:Select rows by most recent year按最近一年选择行
【发布时间】:2016-02-19 23:59:23
【问题描述】:

我有一个多年来在 x 个单元和 y 个采样站(每个单元内的多个站)收集的植被指标数据框。我想选择最近一年收集数据的每个单元的所有植被数据。这是我的数据框的示例:

veg <- c("tree","grass","tree","grass","tree","grass","tree","grass")
cover <- c(0.97,0.21,0.35,0.67,0.45,0.72,0.27,0.67)
unit <- c("U1","U1","U1","U1","U2","U2","U2","U2")
station <- c("A1","A1","A2","A2","A3","A3","A4","A4")
year <- c(2015,2015,2014,2014,2013,2013,2014,2014)
df <- data.frame(veg,cover,unit,station,year)

数据框如下所示:

    veg cover unit station year
1  tree  0.97   U1      A1 2015
2 grass  0.21   U1      A1 2015
3  tree  0.35   U1      A2 2014
4 grass  0.67   U1      A2 2014
5  tree  0.45   U2      A3 2013
6 grass  0.72   U2      A3 2013
7  tree  0.27   U2      A4 2014
8 grass  0.67   U2      A4 2014

我希望它看起来像这样:

    veg cover unit station year
1  tree  0.97   U1      A1 2015
2 grass  0.21   U1      A1 2015
3  tree  0.27   U2      A4 2014
4 grass  0.67   U2      A4 2014

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不想要最近几年?你想定义“最近一年”吗?

标签: r dataframe aggregate subset


【解决方案1】:

不带包是怎么做的。

df.by     = by(df, df$unit, FUN = function(t) t[t$year == max(t$year),])
df.recent = Reduce(function(...) merge(..., all=T), df.by)
df.recent

输出是

>     df.recent
    veg cover unit station year
1 grass  0.21   U1      A1 2015
2 grass  0.67   U2      A4 2014
3  tree  0.27   U2      A4 2014
4  tree  0.97   U1      A1 2015

对于第一行,我们使用函数by 通过因子df$unit 对数据框进行子集化。对于每个子集(每个单元),我们通过匿名函数function(t) t[t$year == max(t$year),])提取最近一年的行。

df.by 是一个数据框列表,其中仅包含每个单元最近一年的行。

对于第二行,我们使用merge 函数来合并df.by 中的所有数据框。这段代码的使用在Simultaneously merge multiple data.frames in a list中有说明。

【讨论】:

    【解决方案2】:

    这得到你的答案,你想要最近的蔬菜/单位吗?

    library(dplyr)
    df %>% 
        group_by(veg, unit) %>% 
        arrange(desc(year)) %>% 
        slice(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2015-07-31
      • 2017-12-11
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多