当 R 中的另一个向量中存在指定条目时,如何创建一个也重复最后一个值的序列?
How can I create a sequence that also repeats the last value when specified entries are present in another vector in R?
我想创建 x2 下显示的内容。
我想从 1 开始,让 x2 中的值每次增加一个值。当 x1 中出现 TRUE 时,该值应该增加一次并保持不变,除非跟随三个或更多 TRUE,在这种情况下,它应该在每隔一对 TRUE 期间增加一个值。
x1 中的一个 TRUE 将始终在下一行中跟随至少一个 TRUE。
示例问题和预期结果:
x1<-c("FALSE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE")
x2<-c(1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11)
data.frame(x1, x2)
x1 x2
1 FALSE 1
2 FALSE 2
3 TRUE 3
4 TRUE 3
5 FALSE 4
6 TRUE 5
7 TRUE 5
8 FALSE 6
9 TRUE 7
10 TRUE 7
11 TRUE 8
12 TRUE 8
13 FALSE 9
14 TRUE 10
15 TRUE 10
16 FALSE 11
也许我把这个复杂化了,但这里有一个方法:
library(dplyr)
df %>%
group_by(gr = data.table::rleid(x1)) %>%
mutate(gr1 = !x1 | (x1 & row_number() %% 2 == 1)) %>%
ungroup() %>%
mutate(out = cumsum(gr1)) %>%
select(-gr, -gr1)
# x1 x2 out
# <lgl> <int> <int>
# 1 FALSE 1 1
# 2 FALSE 2 2
# 3 TRUE 3 3
# 4 TRUE 3 3
# 5 FALSE 4 4
# 6 TRUE 5 5
# 7 TRUE 5 5
# 8 FALSE 6 6
# 9 TRUE 7 7
#10 TRUE 7 7
#11 TRUE 8 8
#12 TRUE 8 8
#13 FALSE 9 9
#14 TRUE 10 10
#15 TRUE 10 10
#16 FALSE 11 11
数据
df <- data.frame(x1, x2)
df <- type.convert(df)
cumsum(ave(as.logical(x1), x1, FUN = function(x){
if(x[1] == TRUE) {
rep(1:0, length.out = length(x))
} else {
rep(1, length(x))
}
}))
#[1] 1 2 3 3 4 5 5 6 7 7 8 8 9 10 10 11
我想创建 x2 下显示的内容。
我想从 1 开始,让 x2 中的值每次增加一个值。当 x1 中出现 TRUE 时,该值应该增加一次并保持不变,除非跟随三个或更多 TRUE,在这种情况下,它应该在每隔一对 TRUE 期间增加一个值。
x1 中的一个 TRUE 将始终在下一行中跟随至少一个 TRUE。
示例问题和预期结果:
x1<-c("FALSE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE")
x2<-c(1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11)
data.frame(x1, x2)
x1 x2
1 FALSE 1
2 FALSE 2
3 TRUE 3
4 TRUE 3
5 FALSE 4
6 TRUE 5
7 TRUE 5
8 FALSE 6
9 TRUE 7
10 TRUE 7
11 TRUE 8
12 TRUE 8
13 FALSE 9
14 TRUE 10
15 TRUE 10
16 FALSE 11
也许我把这个复杂化了,但这里有一个方法:
library(dplyr)
df %>%
group_by(gr = data.table::rleid(x1)) %>%
mutate(gr1 = !x1 | (x1 & row_number() %% 2 == 1)) %>%
ungroup() %>%
mutate(out = cumsum(gr1)) %>%
select(-gr, -gr1)
# x1 x2 out
# <lgl> <int> <int>
# 1 FALSE 1 1
# 2 FALSE 2 2
# 3 TRUE 3 3
# 4 TRUE 3 3
# 5 FALSE 4 4
# 6 TRUE 5 5
# 7 TRUE 5 5
# 8 FALSE 6 6
# 9 TRUE 7 7
#10 TRUE 7 7
#11 TRUE 8 8
#12 TRUE 8 8
#13 FALSE 9 9
#14 TRUE 10 10
#15 TRUE 10 10
#16 FALSE 11 11
数据
df <- data.frame(x1, x2)
df <- type.convert(df)
cumsum(ave(as.logical(x1), x1, FUN = function(x){
if(x[1] == TRUE) {
rep(1:0, length.out = length(x))
} else {
rep(1, length(x))
}
}))
#[1] 1 2 3 3 4 5 5 6 7 7 8 8 9 10 10 11