使用rle从组中获取第一个和最后一个值

时间:2017-08-04 07:01:45

标签: r

我希望使用类似于rle()函数的分组来获取组的第一个和最后一个值。

例如,我有这个数据框:

> df
   df time
1   1    A
2   1    B
3   1    C
4   1    D
5   2    E
6   2    F
7   2    G
8   1    H
9   1    I
10  1    J
11  3    K
12  3    L
13  3    M
14  2    N
15  2    O
16  2    P

我想得到这样的东西:

> want
  df first last
1  1     A    D
2  2     E    G
3  1     H    J
4  3     K    M
5  2     N    P

你怎么看,我想以rle()函数的方式对我的值进行分组。我想只在相同的值彼此相邻时才对元素进行分组。 group_by以不同的方式对元素进行分组。

> rle(df$df)
Run Length Encoding
  lengths: int [1:5] 4 3 3 3 3
  values : num [1:5] 1 2 1 3 2

我的问题有解决方案吗?任何建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

来自to_dt=`date "+%Y-%m-%d %H:%M"` from_dt=`date -d "${to_dt} 1 hour ago" "+%Y-%m-%d %H:%M"` echo $from_dt $to_dt 2017-08-04 01:54 2017-08-04 02:54 while [ "${from_dt}" -lt "${to_dt}" ] do from_dt=`date -d "${from_dt} 1 minute" "+%Y-%m-%d %H:%M"` end_dt_min_after=`date -d "${from_dt} 1 minute" "+%Y-%m-%d %H:%M"` done 的函数rleid可以完成这项工作,即

data.table

由此给出,

library(data.table)

setDT(dt)[, .(df = head(df, 1), 
              first = head(time, 1), 
              last = tail(time, 1)), 
      by = (grp = rleid(df))][, grp := NULL][]

添加 df first last 1: 1 A D 2: 2 E G 3: 1 H J 4: 3 K M 5: 2 N P 方法,如@RonakShah提及

dplyr

给,

library(dplyr)

df %>% 
 group_by(grp = cumsum(c(0, diff(df)) != 0)) %>% 
 summarise(df = first(df), 
           first = first(time), 
           last = last(time)) %>% 
 select(-grp)

答案 1 :(得分:1)

以下是使用base Rrle的选项。在第一列上执行rle后,使用values复制lengths的序列,使用该序列创建包含duplicated的逻辑索引,然后对原始值进行子集化基于索引的数据集

rl <- rle(df[,1])
i1 <- rep(seq_along(rl$values), rl$lengths)
i2 <- !duplicated(i1)
i3 <- !duplicated(i1, fromLast = TRUE)
wanted <- data.frame(df = df[i2,1], first =  df[i2,2], last = df[i3,2])
wanted
#   df first last
#1  1     A    D
#2  2     E    G
#3  1     H    J
#4  3     K    M
#5  2     N    P