gpt4 book ai didi

r - 使用 rle 消除第一个和最后一个序列

转载 作者:行者123 更新时间:2023-12-01 00:19:35 24 4
gpt4 key购买 nike

我正在尝试使用 rle() 解决 R 的问题(或其他相关功能)但不确定从哪里开始。问题如下- foo , bar , 和 bazqux可以在三个位置之一 - A , B , 或 C .

他们的第一个位置永远是 A ,他们最后的位置总是 C ,但它们之间的位置是随机的。

我的目标是消除第一个 A 或 A 的第一个序列,以及最后一个 C 或 C 的最后一个序列。例如:

> foo
position
1 A
2 A
3 A
4 B
5 B
6 A
7 B
8 A
9 C
10 C

> output(foo)
position

4 B
5 B
6 A
7 B
8 A


> bar
position
1 A
2 B
3 A
4 B
5 A
6 C
7 C
8 C
9 C
10 C

> output(bar)
position

2 B
3 A
4 B
5 A

> baz
position
1 A
2 A
3 A
4 A
5 A
6 C
7 C
8 C
9 C
10 C

> output(baz)
NULL

> qux
position
1 A
2 C
3 A
4 C
5 A
6 C

> output(qux)
position
2 C
3 A
4 C
5 A

基础版 rle()会告诉我有关序列及其长度的信息,但不会保留行索引。应该如何解决这个问题?
> rle(foo$position)
Run Length Encoding
lengths: int [1:6] 3 2 1 1 1 2
values : chr [1:6] "A" "B" "A" "B" "A" "C"

最佳答案

我会用 cumsum 写一个函数我们检查有多少个连续的值以 first_position 开头以及有多少个最后的连续值以 last_position 开头并删除它们。

get_reduced_data <- function(dat, first_position, last_position) {
dat[cumsum(dat != first_position) != 0 &
rev(cumsum(rev(dat) != last_position) != 0)]
}

get_reduced_data(foo, first_position, last_position)
#[1] "B" "B" "A" "B" "A"

get_reduced_data(bar, first_position, last_position)
#[1] "B" "A" "B" "A"

get_reduced_data(baz, first_position, last_position)
#character(0)

get_reduced_data(qux, first_position, last_position)
#[1] "C" "A" "C" "A"

数据
foo <- c("A", "A","A", "B", "B", "A", "B", "A", "C")
bar <- c("A", "B","A", "B", "A", "C", "C", "C", "C", "C")
baz <- c(rep("A", 5), rep("C", 5))
qux <- c("A", "C", "A", "C", "A", "C")
first_position <- "A"
last_position <- "C"

关于r - 使用 rle 消除第一个和最后一个序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49892866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com