R: Проблемы с условием "если" - PullRequest
0 голосов
/ 18 февраля 2019

Я имею дело со следующей проблемой, у меня есть два вектора, а именно:

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 голосов
/ 18 февраля 2019

Вот вам идея 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

Кроме того, как указал Паоло, согласно вашей логике, первые 4 элемента должны быть удалены

0 голосов
/ 18 февраля 2019

ok состоит из всех значений 2*index1[i]+k, поэтому, если index2[j] не найдено в ok, тогда NA его не найдет:

ok <- outer(2*index1, 0:3, `+`)
replace(index2, ! (index2 %in% ok), NA)

В качестве альтернативы, сохраняются только элементы, найденные в ok:

index2[index2 %in% ok]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...