我正在处理以下问题,我有两个向量:
index1<-c(10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21, 22, 23, 24, 25, 26, 27, 28, 29)
index2<-c(17 ,18, 19, 20 ,22 ,23, 24, 25, 26, 27, 28, 29, 30 ,31 ,32, 33 ,42, 43, 44,45, 46 ,47 ,48, 49, 50, 51, 52 ,53, 54 ,55, 56)
我希望保留所有可以写为index2[j]
的组件2*index1[i]+k
,其中k=0,1,2,3
。对于某些i in 1:length(index1),j in 1:length(index2)
例如,这是index2的第一个组成部分,为17,并且不能将其写为2*index1[i]+k
,因此应删除该第一个组成部分(或用NA代替)。
我很难弄清楚该怎么做,我试图做一个循环但没有成功。
for(j in 1:length(index2)){
for(i in 1:length(index1)){
for(k in 0:3){
if (index2[j]!=(2*index1[i]+k)){index2[j]=NA}else{index2[j]=index2[j]}}}}
在此特定示例中,所需的输出是向量index2_refined
,该向量包含index2
的所有分量,但第一个分量除外,即
c( 20 ,22 ,23, 24, 25, 26, 27, 28, 29, 30 ,31 ,32, 33 ,42, 43, 44,45, 46 ,47 ,48, 49, 50, 51, 52 ,53, 54 ,55, 56)
任何帮助将不胜感激。
答案 0 :(得分:2)
ok
由2*index1[i]+k
的所有值组成,因此,如果在index2[j]
中找不到ok
,则将其排除:
ok <- outer(2*index1, 0:3, `+`)
replace(index2, ! (index2 %in% ok), NA)
或者,仅保留在ok
中找到的元素:
index2[index2 %in% ok]
答案 1 :(得分:1)
这里有一个for()
的想法:
library(dplyr)
index1.1 = unique(2*rep(index1,4) + c(rep(1,length(index1)),rep(2,length(index1)),rep(3,length(index1)),rep(4,length(index1))))
index2[index2 %in% index1.1]
[1] 22 23 24 25 26 27 28 29 30 31 32 33 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
而且,正如Paolo所指出的那样,根据您的逻辑,应该删除前四个元素