若元素为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"