给出一个数据框:
> df <- data.frame( L=c('a','b','b'), t0=c(1,10,20), t1=c(9,19,39))
> df
L t0 t1
1 a 1 9
2 b 10 19
3 b 20 39
I want:
> df
L t0 t1
1 a 1 9
2 b 10 39
df $ L的相同值等于“ b”,表示“ b”的第一个实例的开始(t0)应该是()的最后一个实例的新的“ t0”值和新的“ t1”值连续)“ b”应为新的“ t1”值。实际上,如果t0和t1是时间,那么我想合并相邻行的“ L”值相同的持续时间。
答案 0 :(得分:4)
按“ L”分组后,summarise
取{t1”的first
值和“ t1”的last
值(或min
和{{1 }})
max
基于OP的注释,如果我们也按“ L”中的相邻相似元素进行分组,请使用df %>%
group_by(L) %>%
summarise(t0 = first(t0), t1 = last(t1))
# A tibble: 2 x 3
# L t0 t1
# <fct> <dbl> <dbl>
#1 a 1 9
#2 b 10 39
rleid
library(data.table)
df1 %>%
group_by(grp = rleid(L), L) %>%
summarise(t0 = first(t0), t1 = last(t1))
答案 1 :(得分:3)
您可以split
L
并返回range
。
df <- do.call(rbind, lapply(split(df[-1], df[1]), range))
df
# [,1] [,2]
#a 1 9
#b 10 39
df <- data.frame(L=rownames(df), t0=df[,1], t1=df[,2])
df
# L t0 t1
#a a 1 9
#b b 10 39
答案 2 :(得分:0)
也许您可以尝试aggreate
和merge
res <- merge(aggregate(t0 ~ L,df,min),aggregate(t1 ~ L,df,max))
如此
> res
L t0 t1
1 a 1 9
2 b 10 39
答案 3 :(得分:0)
使用data.table
:
library(data.table)
setDT(df)
df[, .(t0 = t0[1], t1 = t1[.N]), by = L]
# L t0 t1
# 1: a 1 9
# 2: b 10 39