根据通用值梳理R中的数据帧行

时间:2019-12-04 05:34:10

标签: r

给出一个数据框:

    > 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”值相同的持续时间。

4 个答案:

答案 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)

也许您可以尝试aggreatemerge

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