这个问题看起来很简单,但我没弄清楚它是如何在R中完成的 . 我想根据其值的模式修改逻辑向量 . 有两个修改步骤:
-
如果有一个被TRUE值包围的FALSE,请将其切换为TRUE .
-
如果有少于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语句 .
有没有更好的方法让这个工作?
3 回答
这是一种方法:
首先,找到FALSE值需要更改为TRUE值的索引,方法是查找后面的FALSE值,后面跟着TRUE值
更改值
接下来,查找长度小于3的TRUE(和FALSE)运行,并将它们设置为FALSE .
您可以尝试
rle
(感谢@Frank进行修改)尝试:
该函数利用了T和F可以被强制转换为数字的事实 . 搜索的模式是“101” .