Это потому, что вы запрашиваете столбцы выше, чем 40, когда i
> 20. Смотрите этот пример:
set.seed(1)
DF <- data.frame(matrix(rnorm(40*100), ncol = 40))
## simple function to apply/use
foo <- function(x1, x2) return(x1 - x2)
## something to hold results
res <- matrix(ncol = ncol(DF), nrow = nrow(DF))
## loop - oops error
for(i in seq_len(ncol(DF))) {
res[,i] <- foo(DF[,i], DF[,i+20])
}
Вы получаете эту ошибку:
Error in `[.data.frame`(DF, , i + 20) : undefined columns selected
Это потому что i
принимает значения 1, ..., 40. Как только i> = 21, (i + 20)> 40, и у вас есть только 40 столбцов данных. Простая модификация заключается в петлю только в течение первых 20 столбцов:
## something to hold results
res <- matrix(ncol = ncol(DF)/2, nrow = nrow(DF))
for(i in seq_len(ncol(DF)/2)) {
res[,i] <- foo(DF[,i], DF[,i+20])
}
, если все, что вы хотите, это Col 1 и седловин 21, цв 2 и столбец 22 и т.д. Если вы хотите, чтобы все попарные сравнения, то вам нужно попробовать что-то разные, поскольку один цикл не будет работать.
(Перед тем как кто-то тянет меня за крайне неэффективное использование цикла, этот примером был только что, пример, не воображения, примененного к функции foo()
. В этом случае DF[, 1:20] - DF[, 21:40]
даст тот же результат, как и в res
.)
что «другие функции» вы хотите использовать? То есть что вы хотите сделать с парным рядом. Кажется мало смысла копировать/дублировать данные в цикле для использования в некоторой другой функции, когда индексации будет достаточно. Но если вы сообщите нам о функции, которую хотите использовать, и какова реальная проблема, возможно, мы сможем предложить более эффективные решения? Измените свой вопрос, чтобы предоставить дополнительную информацию или добавить комментарий здесь. –
Извините за недостаток информации. У меня есть информационный кадр с безработицей и уровень производительности для 20 стран, поэтому у меня есть 40 серий в моем кадре данных. Мне нужно выбрать de pairwise, потому что я хочу использовать функцию «ca.jo» из пакета «urca», что позволяет мне изучать соотношение коинтеграции между «попарно» рядами. Если я делаю это вручную, это занимает много времени, поэтому я хотел применить цикл, чтобы я мог реализовать его сразу. для (i в 1: ncol (Дата)) { попарно <-Date [, c (i, i + 20)] rt <- ca.jo (попарно, K = 2, season = spec = "longrun") print (summary (rt)) Большое спасибо – ganlmy
Вам не нужно 'попарно', просто указав непосредственно в' ca.jo': 'rt <- ca.jo (Date [, c (i , i + 20)], K = 2, season = spec = "longrun") ' –