Суммируйте логические результаты циклов - PullRequest
0 голосов
/ 21 февраля 2019

рассмотрим два вектора test1 <- c(1,2,3,4,5,3) test2 <- c(2,3,4,5,6,7,2) Моя цель - создать вектор, содержащий только те значения, которые можно найти в обоих векторах.Результатом должен быть вектор типа 2 3 4 5

. В связи с этим у меня есть два вопроса.

1) Как получить желаемый результат в R?(даже с 3 векторами, скажем, test3 <- c(1,3,5,6,7), и я хотел получить все значения, которые можно найти во всех трех векторах 3 5

2) Я попытался написать цикл для этого, но это не помогло быработа, как задумано.Любопытно, что если я запускаю каждый шаг своего кода вручную, все работает как задумано.Что мне не хватает?Почему мой код не работает?

Идея состоит в том, чтобы создать вектор test4 <- c(test1, test2) и итеративно проверить, можно ли найти значение в test1 и test2.

for(i in levels(as.factor(test4))){        #loop for all occuring levels
  log1 <- rep(0,nlevels(as.factor(test4))) #create logical vector
  log1 <- as.logical(log1)                 #to store results
  if(is.element(i,test1) == TRUE & is.element(i,test2) == TRUE){
    log1[which(levels(as.factor(test4)) == i)] <- TRUE
  } else{
    log1[which(levels(as.factor(test4)) == i)] <- FALSE
}
#if i is element of test1 and test2 the the corresponding entry
#in log1 becomes TRUE, otherwise FALSE

Это приводитрезультат

log1
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Теперь можно думать об ошибках в циклах.Чтобы проверить это, я напечатал значения, и все они верны:

for(i in levels(as.factor(test4))){
  if(is.element(i,test1) == TRUE & is.element(i,test2) == TRUE){
    print(TRUE)
  } else{
    print(FALSE)
  }
}
[1] FALSE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] FALSE
[1] FALSE

Чтобы проверить индекс, я запускаю этот код

for(i in levels(as.factor(test3))){
  j <- which(levels(as.factor(test3)) == i)
  print(j)      
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7

Кажется, все правильно на данный момент,Теперь я запускаю код вручную и получаю желаемый результат:

test1 <- c(1,2,3,4,5)
test2 <- c(2,3,4,5,6,7)

test4 <- c(test1, test2)         

log1 <- rep(0,nlevels(as.factor(test4)))
log1 <- as.logical(log1)

log1[1] <- is.element(1,test1) == TRUE & is.element(1,test2) == TRUE
log1[2] <- is.element(2,test1) == TRUE & is.element(2,test2) == TRUE
log1[3] <- is.element(3,test1) == TRUE & is.element(3,test2) == TRUE
log1[4] <- is.element(4,test1) == TRUE & is.element(4,test2) == TRUE
log1[5] <- is.element(5,test1) == TRUE & is.element(5,test2) == TRUE
log1[6] <- is.element(6,test1) == TRUE & is.element(6,test2) == TRUE
log1[7] <- is.element(7,test1) == TRUE & is.element(7,test2) == TRUE
log1
[1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

Я пытался установить индекс j <- which(levels(as.factor(test4)) == i) и заменить записи log[j].

Цикл if не нужен,но это помогло найти проблему.цикл for может быть записан как

for(i in levels(as.factor(test4))){
  log1 <- rep(0,nlevels(as.factor(test4)))
  log1 <- as.logical(log1)
  log1[which(levels(as.factor(test4)) == i)] <- is.element(i,test1) == TRUE & is.element(i,test2) == TRUE
}

, что не помогает.Я действительно не знаю, что я здесь не так сделал.Я искал в Интернете и переполнении стека, но я не мог найти решение.Я надеюсь, что вы можете!

1 Ответ

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

Соберите уникальные значения, затем сохраните дубликаты:

all <- c(unique(test1), unique(test2))
all[duplicated(all)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...