【问题标题】:Grouping variables select first row (keep one column), last row (keep different column)分组变量选择第一行(保留一列),最后一行(保留不同的列)
【发布时间】:2017-10-23 13:46:12
【问题描述】:

我有下表:

id  origin destination price
 1     A      B          2
 1     C      D          2
 2     A      B          3
 3     B      E          6
 3     E      C          6
 3     C      F          6

基本上我想要做的是将它按id 分组,从origin 中选择第一个元素,并从destination 中保留最后一个元素,从而生成此表。

id  origin destination price
 1     A      D          2
 2     A      B          3
 3     B      F          6

我知道如何选择第一行和最后一行,但不会做我想做的事。

df %>%
group_by(id) %>%
slice(c(1, n())) %>%
ungroup()

是否可以使用dplyr 甚至data.table 来做到这一点?

【问题讨论】:

  • 随便df %>% group_by(id) %>% summarise(origin = first(origin), destination = last(destination), price = first(price))
  • @akrun 一如既往地完美运行。不知道摘要的第一个和最后一个功能。谢谢。

标签: r dataframe data.table dplyr


【解决方案1】:

使用split 的基本 R 方法:

do.call(rbind, lapply(split(df, df$id), 
                      function(a) with(a, data.frame(origin=head(origin,1), destination=tail(destination,1), price=head(price,1)))))

#  origin destination price
#1      A           D     2
#2      A           B     3
#3      B           F     6

【讨论】:

    【解决方案2】:

    library(data.table)的解决方案:

    unique(setDT(df)[, "origin" := origin[1] , by = id][, "destination" := destination[.N], by = id][, "price" := price[1] , by = id][])
    

    Imo 建议的快捷方式:

    setDT(df)[, .(origin=origin[1], destination=destination[.N], price=price[1]), by=id]
    

    【讨论】:

    • 一通电话,dt[, .(origin=origin[1], destination=destination[.N], price=price[1]), by=id]。
    • 不错,请随意发帖,然后我删除这个。
    • 没关系。如果需要,您可以将其添加到您的答案中。
    • 快捷方式完美运行。必须先将数据框转换为 data.table 的小细节。
    猜你喜欢
    • 2020-06-11
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多