R — итерация для создания списка из условия на основе нескольких списков / векторов

#r #list #loops

#r #Список #циклы

Вопрос:

Я начинающий программист, и у меня возникают проблемы с пониманием ввода / вывода вложенных циклов for для нескольких списков (или векторов) в R. Я уверен, что на этот вопрос был дан ответ в другом месте (если да, пожалуйста, предоставьте ссылку), но я не могу найти хороший ответ в Интернете, и мне было бы полезно (и я уверен, что другие начинающие программисты / R-пользователи) объяснить это простыми словами.

В частности, я хотел бы знать, как правильно индексировать элементы списка, чтобы создать условие, основанное на некоторой взаимосвязи между обоими списками, а затем добавить элементы одного списка, отвечающие этому условию, в новый список.

Другими словами, я хотел бы выполнить итерацию по каждому элементу в списке ‘a’, проверить, соответствует ли он == любому / всем элементам в списке ‘b’, и, если TRUE, добавить элемент списка ‘a’ в новый список ‘c’.

Это упрощенный пример того, что я пробовал:

 a <- as.list(c(1,2,3,11,12))
b <- as.list(c(1,2,3,4,5,6,7,8,9,10))

c <- list()
index <- 1
for (i in 1:length(a)){
  for (j in 1:length(b)){
    if (a[[i]] == b[[j]]) next 
      c[[index]] <- a[[i]]
      index <- index   1
    }}
 

Результатом является список с 47 элементами. Результат, к которому я стремлюсь, следующий:

 c
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3
 

Что не так с тем, как я проиндексировал элементы в цикле?

Ответ №1:

Проще говоря,

 if (condition) next 
 

означает, что если условие ИСТИННО, то ничего не делайте и переходите к следующему циклу.

 if (condition) {action}
 

означает, что если условие ИСТИННО, то выполните действие.

измените его на

 a <- as.list(c(1,2,3,11,12))
b <- as.list(c(1,2,3,4,5,6,7,8,9,10))

c <- list()
index <- 1
for (i in 1:length(a)){
  for (j in 1:length(b)){
    if (a[[i]] == b[[j]]) {
      c[[index]] <- a[[i]]
      index <- index   1
    }}}
 

тогда это сработало бы

Ответ №2:

Вместо двойного цикла for вы можете использовать %in%

 a[a %in% b]
#[[1]]
#[1] 1
#
#[[2]]
#[1] 2
#
#[[3]]
#[1] 3
 

Комментарии:

1. Хорошо, но что, если я хочу написать более сложное условие, чем просто == элементы? Надеясь на более общее решение, в которое можно заменить другие функции условий.

2. @Dorothy Я могу ответить только на основе предоставленных вами примеров данных и ожидаемого результата, который вы показали. Однако двойной цикл for обычно не лучший вариант.

3. Что я должен изучить для написания условия, основанного на сравнении двух списков, если не двойной цикл for?

4. Какова ваша конечная цель?

5. Я использую этот тип сравнений по многим причинам, и в основном я имею дело с пространственными данными, используя пакет sp. Итак, например, я хочу посмотреть, пересекается ли каждый элемент в списке пространственных точек с каждым элементом в списке пространственных полигонов, и если TRUE, добавьте эти пространственные точки в новый список.