R:“如果”条件存在的问题

时间:2019-02-18 17:30:28

标签: r loops if-statement vector

我正在处理以下问题,我有两个向量:

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)

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

ok2*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所指出的那样,根据您的逻辑,应该删除前四个元素