Можно ли использовать векторный индекс 1 с элементом списка 1, индекс 2 с элементом 2 и т. Д.? - PullRequest
0 голосов
/ 22 января 2019

У меня есть набор числовых координат, представляющих начальную и конечную позиции вектора, которые необходимо проверить по таблице смежных областей, чтобы увидеть, в каких они присутствуют. Для каждой пары начальной и конечной позиций есть другая таблица регионов для проверки. Числовые координаты в настоящее время хранятся в паре одинаково индексированных векторов (так что начинается [1] пар с концов [1]), что будет проверено по таблице [[1]]. У меня уже есть это в цикле for, но мне интересно, есть ли более быстрый способ сделать это (возможно, с использованием некоторого члена семейства apply), учитывая, что индекс для векторов и элементов списка всегда одинаков.

Вероятно, это легче понять на примере:

starts <- c(7, 163); ends <- c(15, 165)

df1 <- data.frame(seq(from = 1, to = 91, by = 10), 
    seq(from = 10, to = 100, by = 10), paste0('Region', 1:10))

df2 <- data.frame(seq(from = 101, to = 191, by = 10), 
    seq(from = 110, to = 200, by = 10), paste0('Region', 1:10))

mylist <- list(df1, df2)


# With a for loop, I could iterate through as follows:

for (n in 1:length(starts)) {

  regions <- which(starts[n] >= mylist[[n]][, 1] & starts[n] <= mylist[[n]][, 2]):which(ends[n] >= mylist[[n]][, 1] & ends[n] <= mylist[[n]][, 2])

  print(mylist[[n]][regions, 3])

}

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

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

Я думаю, что я мог бы сохранить новый список с двумя начальными и конечными индексами и подкадрами данных, являющимися подсписками (т. Е. mylist <- list(list(starts[1], ends[1], df1), list(starts[2])...), но мне интересно, есть ли что-нибудь чище?

1 Ответ

0 голосов
/ 24 января 2019

Разобрался - на случай, если кто-нибудь столкнется с этим в будущем, установка X в lapply на 1:length(list/vector) работает отлично.

В моем примере выше вместо цикла for попробуйте:

lapply(X = 1:length(mylist), 
       FUN = function(n) { mylist[[n]]
                                      [which(starts[n] >= mylist[[n]][, 1] & 
                                             starts[n] <= mylist[[n]][,2]):
                                       which(ends[n] >= mylist[[n]][, 1] &
                                             ends[n] <= mylist[[n]][, 2]), 3] } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...