【问题标题】:Aggregate by one variable but adding other variables [duplicate]按一个变量聚合但添加其他变量[重复]
【发布时间】:2016-08-24 19:57:58
【问题描述】:

我有一个具有这种结构的data.frame

id time var1 var2 var3
1     2    4    5    6
1     4    8   51    7
1     1    9   17   38
2    12    8    9   21
2    15   25    6   23

对于所有 id,我想要包含最短时间的行。在示例中是这样的:

id time var1 var2 var3   
1     1    9   17   38
2    12    8    9   21

我认为aggregate 函数会很有用,但我不知道如何使用它。

【问题讨论】:

  • 请提供一个可重现的例子
  • 你有决胜局吗?还是保证一个最小值?

标签: r dataframe aggregate


【解决方案1】:

您的标题可能具有误导性,因为您真的只想为每个id 保留最少time 的行。试试这个:

library(dplyr)
df %>%
    group_by(id) %>%
    arrange(id, time) %>%
    filter(row_number() == 1)

【讨论】:

    【解决方案2】:

    我们可以使用bydo.call 和有用的which.min 函数来获得我们需要的东西:

    do.call('rbind', by(df, df$id, function(x) x[which.min(x$time), ]))
    
    #   id time var1 var2 var3
    # 1  1    1    9   17   38
    # 2  2   12    8    9   21
    

    如果您怀疑每个 id 可能有多个最小值,您可以避开 which.min 函数并使用 which(x$time == min(x$time))

    do.call('rbind', by(df, df$id, function(x) x[which(x$time == min(x$time)), ]))
    
    #   id time var1 var2 var3
    # 1  1    1    9   17   38
    # 2  2   12    8    9   21
    

    数据

    df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L), 
    time = c(2L, 4L, 1L, 2L, 15L), 
    var1 = c(4L, 8L, 9L, 8L, 25L), 
    var2 = c(5L, 51L, 17L, 9L, 6L), 
    var3 = c(6L, 7L, 38L, 21L, 23L)), 
    .Names = c("id", "time", "var1", "var2", "var3"), 
    class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

      【解决方案3】:

    • dplyr 使用函数slice
    • library(dplyr)
      df %>% 
          group_by(id) %>% 
          slice(which.min(time))
      

      输出:

      Source: local data frame [2 x 5]
      Groups: id [2]
      
           id  time  var1  var2  var3
        <dbl> <dbl> <dbl> <dbl> <int>
      1     1     1     9    17    38
      2     2    12     8     9    21
      

    • sqldf
    • library(sqldf)
      sqldf('SELECT id, MIN(time) time, var1, var2, var3
                              FROM df 
                              GROUP BY id')
      

      输出:

        id time var1 var2 var3
      1  1    1    9   17   38
      2  2   12    8    9   21
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 2011-02-26
        • 2016-04-06
        相关资源
        最近更新 更多