由一个变量聚合但添加其他变量

时间:2016-08-24 19:57:59

标签: r dataframe aggregate

我有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函数会有用,但我不确定如何使用它。

3 个答案:

答案 0 :(得分:1)

您的标题可能会产生误导,因为您确实希望每行time保留最低id行。试试这个:

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

答案 1 :(得分:1)

我们可以使用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))

答案 2 :(得分:1)

使用函数slice

  • dplyr
    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