gpt4 book ai didi

替换/修改逻辑向量中的值(模式匹配)

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

问题看起来很简单,但我没有弄清楚如何在 R 中完成。我想根据其值的模式修改逻辑向量。有两个修改步骤:

  1. 如果单个 FALSE 被 TRUE 值包围,则将其切换为 TRUE。
  2. 如果少于 3 个连续的 TRUE 值,将它们切换为 FALSE。

其他一切都应该保持原样。这是一个例子:

# input  
x = c(FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE,
FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)

# output
xo = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE,
TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)

cbind(x,xo)

          x    xo
[1,] FALSE FALSE
[2,] TRUE FALSE
[3,] FALSE FALSE
[4,] FALSE FALSE
[5,] TRUE FALSE
[6,] TRUE FALSE
[7,] FALSE FALSE
[8,] FALSE FALSE
[9,] TRUE TRUE
[10,] TRUE TRUE
[11,] TRUE TRUE
[12,] FALSE TRUE
[13,] TRUE TRUE
[14,] TRUE TRUE
[15,] FALSE FALSE
[16,] FALSE FALSE
[17,] TRUE TRUE
[18,] TRUE TRUE
[19,] TRUE TRUE
[20,] TRUE TRUE
[21,] FALSE FALSE

我不想使用 for 循环,因为它很慢而且我必须做很多 if 语句。

有没有更好的方法来让它工作?

最佳答案

这里有一个方法:

#sample data 
x <- c(FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE,
FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE)

首先,找到需要将 FALSE 值更改为 TRUE 值的索引,方法是查找 FALSE 值和 TRUE 值

tochange <- 
intersect(
intersect(
which(x == FALSE), # not strictly necessary
which(diff(x) == 1) # FALSEs followed by a TRUE
),
which(diff(x) == -1) + 1 # FALSEs that follow a TRUE
)

更改值

x[tochange] <- TRUE

接下来,查找长度小于 3 的 TRUE(和 FALSE),并将它们设置为 FALSE。

xrle <- rle(x)

xrle$values[xrle$lengths < 3] <- FALSE

newx <- inverse.rle(xrle) # thanks to Frank for pointing out inverse.rle!

# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
#[10] TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE
#[19] TRUE TRUE FALSE

关于替换/修改逻辑向量中的值(模式匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30955563/

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