Автоматическое создание производных переменных в кадре данных

Возможный дубликат:
Обработка списка data.frames с помощью семейства функций «apply»

У меня есть кадр данных с шестью числовыми переменными V1, V2, V3 и V1.lag, V2.lag, V3.lag.

ПРИМЕЧАНИЕ. В моем реальном наборе данных намного больше переменных, но я использую 3 только для иллюстрации!

Я хотел бы иметь возможность автоматически (без жесткого кодирования чего-либо) запускать все переменные V (не переменные задержки) и создавать переменные V1.over.V1.lag, разделив каждую переменную V на соответствующую переменную задержки.

df<-data.frame(matrix(rnorm(216),72,6));
colnames(df) <- c("v1.raw", "v2.raw", "v3.raw", "v1.lag", "v2.lag", "v3.lag");

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

** РЕДАКТИРОВАТЬ: я понял, как идентифицировать «сырые» столбцы и столбцы «отставания» **

raws <- sapply( names(df), function(x){ unlist(strsplit(x, "[.]"))[2] == "raw" } ); ## which are raw factors

lags <- sapply( names(df), function(x){ unlist(strsplit(x, "[.]"))[2] == "lag" } ); ## which are lagged factors

но я до сих пор не могу понять, как разделить все необработанные факторы с их запаздывающими аналогами

which(raws);

даст мне индексы, но как мне объединить их с лагами в новый фактор?

df[which(raws)] / df[which(lags)]

не работает


person user13467    schedule 04.01.2013    source источник
comment
Что вы пробовали? Можете ли вы расширить ответы в вашем предыдущем вопросе к этому? Где вы застряли? По моему опыту, вы изучите R быстрее и получите гораздо более глубокое понимание, если некоторое время будете бороться с вещами, прежде чем обращаться за помощью. И чем больше вы покажете нам своих боев, тем больше мы будем готовы помочь!   -  person Justin    schedule 04.01.2013
comment
Сначала попробуйте исправить код вашего вопроса, попробуйте изменить свой dd на df и, возможно, удалить столбцы dim1 и dim2, здесь просто запутанно.   -  person agstudy    schedule 04.01.2013
comment
спасибо за комментарий. Я отредактировал основной вопрос, чтобы внести пока единственную рабочую часть моего кода.   -  person user13467    schedule 05.01.2013


Ответы (1)


Предполагая, что в вашем data.frame есть только столбцы v.raw и v.lag, это должно работать

  mm <- colnames(df) <- c("v1.raw", "v2.raw", "v3.raw", "v1.lag", "v2.lag", "v3.lag")
  df[,gregexpr('.raw',mm) > 0] /df[,gregexpr('.*lag',mm) > 0]

Изменить некоторые пояснения к решению:

gregexpr('.raw',mm) > 0
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  

head(df[,gregexpr('.raw',mm) > 0],1)
     v1.raw     v2.raw    v3.raw
1 0.7719037 -0.2078197 -1.223753

regexpr('.lag',mm) > 0
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE

head(df[,gregexpr('.lag',mm) > 0],1)
     v1.lag     v2.lag    v3.lag
1 0.7719037 -0.2078197 -1.223753

Затем мы используем векторизацию / для деления за одну операцию.

Вот пример:

df <- matrix(rep(c(1,2,3,4,5,6),each = 5),ncol=6)
colnames(df) <- c("v1.raw", "v2.raw", "v3.raw", "v1.lag", "v2.lag", "v3.lag")
    v1.raw v2.raw v3.raw v1.lag v2.lag v3.lag
[1,]      1      2      3      4      5      6
[2,]      1      2      3      4      5      6
[3,]      1      2      3      4      5      6
[4,]      1      2      3      4      5      6
[5,]      1      2      3      4      5      6


mm <- colnames(df)
df[,which(gregexpr('.raw',mm) > 0)] /df[,which(gregexpr('.lag',mm) > 0)]

   v1.raw v2.raw v3.raw      #as expected 1/4 2/5 3/6
[1,]   0.25    0.4    0.5 
[2,]   0.25    0.4    0.5
[3,]   0.25    0.4    0.5
[4,]   0.25    0.4    0.5
[5,]   0.25    0.4    0.5

Редактировать2 предотвратить Нэн с нуля

df <- matrix(rep(c(1,2,3,4,5,6),each = 5),ncol=6)
colnames(df) <- c("v1.raw", "v2.raw", "v3.raw", "v1.lag", "v2.lag", "v3.lag")
df[1,4] <- 0              ## I introduce a 0 here
mm <- colnames(df)
## I use ifelse , because it is vectorize also !
## If you find a 0 , don't compute , and retuen me the original value 
## You can do other things here 
ifelse(df[,which(gregexpr('.lag',mm) > 0)] != 0 ,
       df[,which(gregexpr('.raw',mm) > 0)] /df[,which(gregexpr('.lag',mm) > 0)],
       df[,which(gregexpr('.raw',mm) > 0)])  

    v1.lag v2.lag v3.lag    ## for some reasons ifelse choose other columns names!(lag not raw)
[1,]   1.00    0.4    0.5
[2,]   0.25    0.4    0.5
[3,]   0.25    0.4    0.5
[4,]   0.25    0.4    0.5
[5,]   0.25    0.4    0.5
person agstudy    schedule 04.01.2013
comment
извините, я обновляю свой ответ! - person agstudy; 05.01.2013
comment
спасибо, но это дает массив единиц 1,1,1,1,1,1,1,1,1,1 - person user13467; 05.01.2013
comment
та же проблема, что и в моем решении выше - person user13467; 05.01.2013
comment
это дает вам 1, потому что ваш df.raw == df.lag, я добавляю некоторые пояснения к решению. Надеюсь это поможет. - person agstudy; 05.01.2013
comment
Как глупо... большое спасибо. - person user13467; 05.01.2013
comment
Не за что. Надеюсь теперь понятно после объяснений. - person agstudy; 05.01.2013
comment
Еще кое-что. Есть ли изящный способ предотвратить NaN, если один из элементов окажется равным нулю? - person user13467; 05.01.2013
comment
@ user13467 смотрите мое обновление. - person agstudy; 05.01.2013