我希望使用类似于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
我的问题有解决方案吗?任何建议将不胜感激。
答案 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 R
和rle
的选项。在第一列上执行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