若元素为x,前一个元素为na,则替换向量中的元素,单位为R foo

若元素为x,前一个元素为na,则替换向量中的元素,单位为R foo,r,R,这里有一种方法 result <- c("a","a",NA,"whatever","a","a","b","b") 将其包装到函数中以便于使用: > foo [1] "a" "a" NA "whatever" "a" [6] "a" "b" "b" 无论什么一个简单的解决方案: > foo <- c("a","a",NA,"b","a","a","b","b") > what

这里有一种方法

result <- c("a","a",NA,"whatever","a","a","b","b")
将其包装到函数中以便于使用:

> foo
[1] "a"        "a"        NA         "whatever" "a"       
[6] "a"        "b"        "b"
无论什么一个简单的解决方案:

> foo <- c("a","a",NA,"b","a","a","b","b")
> whatever(foo)
[1] "a"        "a"        NA         "whatever" "a"       
[6] "a"        "b"        "b"

一个完全复杂的解决方案,使用
嵌入
只是为了好玩:

library(zoo)
foo[-1][rollapply(foo, 2, identical, c(NA, "b"))] <- "whatever"
foo[which](
申请(
嵌入(foo,2),
1.
函数(x)x[1]=“b”和is.na(x[2])
)
) + 1
]福
[1] “a”“a”“NA”“无论什么”“a”“a”“b”“b”

我正在与“上一个元素”的情况作斗争。我找不到满足这个条件的方法。哇,简单又接近我所尝试的,但是我不太明白-1在这里的用法。foo[-1]删除列表的第一个元素,这是如何工作的?如果我可以问…@Chargaff,你永远不需要替换第一个元素,因为它本来就没有前一个元素。@Chargaff评估
foo
的第一个元素没有意义,因为根据定义,它没有前一个元素。因此,
foo[-1]
贯穿始终(头()从另一端截断),而不是
foo
@Chargaff我在答案中添加了另一个解决方案。
> foo
[1] "a"        "a"        NA         "whatever" "a"       
[6] "a"        "b"        "b"
whatever <- function(x) {
  nas <- which(is.na(x))
  bs <- which(x == "b")
  x[bs[match(nas, bs - 1)]] <- "whatever"
  x
}
> foo <- c("a","a",NA,"b","a","a","b","b")
> whatever(foo)
[1] "a"        "a"        NA         "whatever" "a"       
[6] "a"        "b"        "b"
foo[-1][foo[-1] == "b" & is.na(head(foo, -1))] <- "whatever"
library(zoo)
foo[-1][rollapply(foo, 2, identical, c(NA, "b"))] <- "whatever"
foo[which(
          apply(
                embed(foo,2),
                1,
                function(x) x[1]=="b" & is.na(x[2])
               )
         ) + 1
    ] <- "whatever"

> foo
[1] "a" "a" NA "whatever" "a" "a" "b" "b"