创建一个计数器,只计算某个逻辑值,并给相同的数字重复
Create a counter that only counts a certain logical value and gives the same number to repetitions
假设我有这样一个逻辑值
rex <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, NA)
如何创建一个计数器,它只对 TRUE
进行计数,并将连续重复分组为计数器中的相同值。前任。拥有这样的东西:
1, NA, 2,2,NA, 3, NA
您可以使用 rle
及其逆函数:
inverse.rle(modifyList(b<-rle(rex),list(values = with(b,cumsum(values)*NA^(!values)))))
[1] 1 NA 2 2 NA 3 NA
这也可以写成:
inverse.rle(`[[<-`(b<-rle(rex),"values",with(b,cumsum(values)*NA^(!values))))
分解:
b <- rle(rex)
b$values <- cumsum(b$values) * NA^(!b$values)
inverse.rle(b)
@Onyambu 提供的答案可能是:
with(rle(!is.na(rex) & rex), rep(cumsum(values), lengths)) * rex^NA
[1] 1 NA 2 2 NA 3 NA
当 NA 不只是在向量的末尾时,它也应该工作。
接受的解决方案不适用于以下情况:
rex <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, NA, NA, TRUE)
它打印 1 NA 2 2 NA 3 NA NA NA
.
以下函数returns正确答案:
solution <- function (rex) {
result <- c()
counter <- 1
consecutive <- FALSE
for (i in 1:length(rex)) {
if (rex[i] == TRUE && !is.na(rex[i]) && consecutive) {
result <- c(result, counter)
consecutive <- TRUE
} else if (rex[i] == TRUE && !is.na(rex[i]) && !consecutive) {
result <- c(result, counter)
consecutive <- TRUE
} else{
if(i < length(rex) && rex[i+1] == TRUE && !is.na(rex[i+1])){
counter <- counter + 1
}
result <- c(result, NA)
consecutive <- FALSE
}
}
return(result)
}
调用 solution(rex)
输出 1 NA 2 2 NA 3 NA NA 4
,这是正确答案。
假设我有这样一个逻辑值
rex <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, NA)
如何创建一个计数器,它只对 TRUE
进行计数,并将连续重复分组为计数器中的相同值。前任。拥有这样的东西:
1, NA, 2,2,NA, 3, NA
您可以使用 rle
及其逆函数:
inverse.rle(modifyList(b<-rle(rex),list(values = with(b,cumsum(values)*NA^(!values)))))
[1] 1 NA 2 2 NA 3 NA
这也可以写成:
inverse.rle(`[[<-`(b<-rle(rex),"values",with(b,cumsum(values)*NA^(!values))))
分解:
b <- rle(rex)
b$values <- cumsum(b$values) * NA^(!b$values)
inverse.rle(b)
@Onyambu 提供的答案可能是:
with(rle(!is.na(rex) & rex), rep(cumsum(values), lengths)) * rex^NA
[1] 1 NA 2 2 NA 3 NA
当 NA 不只是在向量的末尾时,它也应该工作。
接受的解决方案不适用于以下情况:
rex <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, NA, NA, TRUE)
它打印 1 NA 2 2 NA 3 NA NA NA
.
以下函数returns正确答案:
solution <- function (rex) {
result <- c()
counter <- 1
consecutive <- FALSE
for (i in 1:length(rex)) {
if (rex[i] == TRUE && !is.na(rex[i]) && consecutive) {
result <- c(result, counter)
consecutive <- TRUE
} else if (rex[i] == TRUE && !is.na(rex[i]) && !consecutive) {
result <- c(result, counter)
consecutive <- TRUE
} else{
if(i < length(rex) && rex[i+1] == TRUE && !is.na(rex[i+1])){
counter <- counter + 1
}
result <- c(result, NA)
consecutive <- FALSE
}
}
return(result)
}
调用 solution(rex)
输出 1 NA 2 2 NA 3 NA NA 4
,这是正确答案。