Попарный цикл через несколько векторов в R
Что у меня в R?
Следующие векторы:
N <- c('a','b')
M <- c('x','y')
Цель
Сохраняя векторы нетронутыми (я не хочу объединять их в матрицу), я бы хотел назвать элементы векторов следующим попарно:
"a" "x" "b" "y"
Код пока что.
Я пытался использовать for
цикл, но, как написано ниже, он читается как вложенный цикл:
for (i in M) for (j in N) {
print(i)
print(j)
}
Что приводит к:
"a" "x" "a" "y" "b" "x" "b" "y"
Что я искал
Используя поисковые термины в качестве нескольких индексов, для циклов и двойных циклов, я смог найти информацию только во вложенных циклах. Использование команд потока не помогло мне в моих поисках.
Настоящая цель.
Я хотел бы добавить одну строку текста в изображение. Текстовые теги хранятся в одном векторе, а изображения также. У меня до сих пор работает код, за исключением вызова элементов векторов попарно, как описано выше. Есть много картинок, а жизнь слишком коротка, чтобы делать все вручную.
Любая помощь будет принята с благодарностью!
Стейн
3 ответа
Как это объясняется в "реальной цели", каждый элемент в векторах "текстовых тегов" соответствует элементу в "векторе изображений". Если это правильно, не так ли просто решение (учитывая, что оба вектора имеют одинаковую длину):
for (i in textTags)
addThisToThat(textTags[i], images[i])
Мы можем rbind
векторы, а затем объединить
c(rbind(M, N))
#[1] "x" "a" "y" "b"
Или другой вариант order
на основе последовательности vector
c(M, N)[order(c(seq_along(M), seq_along(N)))]
#[1] "x" "a" "y" "b"
Если нам действительно нужно for
цикл, а затем предварительно выделить list
с length
равное количеству элементов в "M", выполнить цикл по последовательности одного из векторов и назначить объединенные элементы "M" и "N" на основе индекса для list
элемент и unlist
Это
l1 <- vector("list", length(M))
for(i in seq_along(M)){
l1[[i]] <- c(M[i], N[i])
}
unlist(l1)
#[1] "x" "a" "y" "b"
Знаете ли вы о Lapply? В пакете purrr вы можете найти его эквивалент: map. Вы также можете найти там map_2, который синхронизирует два вектора. Синтаксис похож на map_2(vec1, vec2, ~some_function_of(.x, .y))
Для других людей, задающих этот вопрос, я рекомендую использовать базовую функцию R. mapply
. В отличие отfor
цикл, он автоматически определяет переменные n
а также m
для каждой петли.
mapply(N, M, function(n, m) {
print(n)
print(m)
})
Обратите внимание: это не сработает, если вы хотите что-то печатать в каждом цикле.