#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, добавьте эти пространственные точки в новый список.