2010-12-23 2 views
1

У меня есть data.frame в R с 40 сериями, и я хочу выбрать парную серию для применения функции (например, серии 1 и серии 21, серии 2 и серии 22). Однако я получаю сообщение об ошибке с помощью следующего кода:Петля для выбора парного ряда

for(i in 1:ncol(Date)) { 
    pairwise <-Date[, c(i,i+20)] 
} 

Я хочу использовать pairwise в другой функции.

Не могли бы вы помочь мне?

Спасибо заранее

+0

что «другие функции» вы хотите использовать? То есть что вы хотите сделать с парным рядом. Кажется мало смысла копировать/дублировать данные в цикле для использования в некоторой другой функции, когда индексации будет достаточно. Но если вы сообщите нам о функции, которую хотите использовать, и какова реальная проблема, возможно, мы сможем предложить более эффективные решения? Измените свой вопрос, чтобы предоставить дополнительную информацию или добавить комментарий здесь. –

+0

Извините за недостаток информации. У меня есть информационный кадр с безработицей и уровень производительности для 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

+0

Вам не нужно 'попарно', просто указав непосредственно в' ca.jo': 'rt <- ca.jo (Date [, c (i , i + 20)], K = 2, season = spec = "longrun") ' –

ответ

6

Это потому, что вы запрашиваете столбцы выше, чем 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.)

Смежные вопросы