如何根据r中另一个向量中的值更改向量中的值

时间:2015-08-12 14:16:27

标签: r vector

如果不等于来自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

任何提示如何解决这个问题? 感谢

2 个答案:

答案 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/00*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