我有下表:
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
执行此操作?
答案 0 :(得分:3)
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]
答案 1 :(得分: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