如果不等于来自3和4中的另一个向量的值,我想在向量中将值设置为零。例如:
x = [1] 2 3 4 5 6 7 8 9 10 11 12 13 14
y = [,1] [,2] [,3] [,4]
[1,] 0.35146459 8167 4 5
[2,] 0.01886205 24571 7 9
[3,] 0.32501692 73776 12 14
结果我想要这个载体
z = [1] 0 0 4 5 0 7 8 9 0 0 12 13 14
任何提示如何解决这个问题? 感谢
答案 0 :(得分:3)
假设我们想要获得第3列和第4列的每一行之间的序列,请检查这些值是否在' x'如果不存在,请将其替换为' 0',一个可能的选项是
(x %in% unlist(Map(`:`, y[,3], y[,4])))*x
#[1] 0 0 4 5 0 7 8 9 0 0 12 13 14
只需拆分上述解决方案以便于理解。在这里,我们使用Map
来获取' y'的第3和第4列的每个元素之间的序列。输出为list
。
Map(`:`, y[,3], y[,4])
#[[1]]
#[1] 4 5
#[[2]]
#[1] 7 8 9
#[[3]]
#[1] 12 13 14
现在,我们unlist
创建vector
unlist(Map(`:`, y[,3], y[,4]))
#[1] 4 5 7 8 9 12 13 14
下一步是检查是否在' x'中找到了上述值。或不。为此,我们使用%in%
。输出是' TRUE / FALSE'的逻辑向量。根据是否' x'元素可以在上面的向量输出中找到。
x %in% unlist(Map(`:`, y[,3], y[,4]))
#[1] FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE
#[13] TRUE
在最后一步中,我们将(*
)逻辑向量乘以' x'值使得逻辑向量被强制转换为整数表示,即TRUE/FALSE
转换为1/0
和0*any number = 0
以及1* any number = any number
,我们得到
(x %in% unlist(Map(`:`, y[,3], y[,4])))*x
#[1] 0 0 4 5 0 7 8 9 0 0 12 13 14
x <- 2:14
y <- matrix(c(0.35146, 0.0188, 0.325, 8167, 24571, 73776, 4,7, 12,
5, 9, 14), ncol=4)
答案 1 :(得分:2)
不如@ akrun的解决方案那么优雅,但自从我开始研究它以后,我不妨发布这个替代版本:
x[!(x %in% unlist(lapply(1:nrow(y), function(z) seq(y[z,3],y[z,4]))))] <- 0
> x
#[1] 0 0 4 5 0 7 8 9 0 0 12 13 14