Различен брой редове за замяна и данни след diff() приложен към списък с кадри с данни

Имам списък от 993 елемента, като всеки елемент се състои от седем променливи с различен брой наблюдения. Този списък е създаден чрез разделяне на рамка с данни.

Трябва да приложа функцията diff() към една от променливите в елементите. Въпреки това, когато се опитам, R ми дава следната грешка:

Грешка в [[<-.data.frame(*tmp*, "DiffINT", стойност = c(1.02, 0, 0, 0, : замяната има 30 реда, данните имат 34

Следното е цикълът, който използвам.

 for (i in 1:993){
   ONT.list[[i]][["DiffINT"]] <- diff(ONT.list[[i]][["INTprice"]], lag = 4)
 }

Променливата DiffINT съдържа толкова редове, колкото останалите променливи в елемента, и в момента е запълнена с NA. Моята цел е да оставя първите 4 NA там, тъй като данните трябва да са със закъснение.

Всякакви предложения за това как да заобиколите тази грешка или да манипулирате елементите в списъка по-ефективно са добре дошли. Благодаря предварително!

РЕДАКТИРАНЕ: Благодаря на коментаторите за тяхната помощ, добавянето на 4 NA проработи! Но при продължаването на цикъла възникна нов проблем: когато дължината на реда е по-малка от 4.

Грешка в [[<-.data.frame(*tmp*, "DiffINT", стойност = c(NA_real_, NA_real_, : замяната има 4 реда, данните имат 2

Предложения?

РЕДАКТИРАНЕ 2:

Схванах го. Добавен оператор if.

 for (i in 1:993) {
   if (length(ONT.list[[i]][["INTprice"]]) >= 4)
   ONT.list[[i]][["DiffINT"]] <- c(rep(NA,4),diff(ONT.list[[i]]
   [["INTprice"]], lag = 4))
 }

Благодаря отново на всички.


person Zuzanna    schedule 15.06.2018    source източник
comment
Каква е дължината на diff(1:3)?   -  person IceCreamToucan    schedule 15.06.2018
comment
А от diff(1:5, lag = 4)?   -  person Rui Barradas    schedule 15.06.2018
comment
Не съм сигурен, че разбрах въпросите ви, но изпълнението на length() с вашите заявки връща 2 (за 1:3) и 1 (за 1:5, изоставане = 4).   -  person Zuzanna    schedule 15.06.2018
comment
@ZuzannaJurewicz Мисля, че трябва да се промениш като ONT.list[[i]][["DiffINT"]] <- c(rep(NA,4),diff(ONT.list[[i]][["INTprice"]], lag = 4)   -  person MKR    schedule 15.06.2018
comment
Мисля, че @Rui се опитваше да разбере, че изглежда, че заменяте вектор с по-къс вектор (функцията diff връща по-къс вектор). Така че вероятно ще трябва да подпълните замяната с NAs (вижте предложението на @MKR)   -  person zack    schedule 15.06.2018
comment
@zack да, точно това имах предвид, MKR прави това, което вярвах, че ще стане очевидно за OP. Но както много пъти, очевидното изобщо не е еднакво за всички.   -  person Rui Barradas    schedule 15.06.2018
comment
Благодаря на всички. Моля, вижте редакцията за нов брой. @RuiBarradas Наистина. Концептуално беше очевидно, но уменията ми за R силно липсват, така че изпълнението беше по-трудно.   -  person Zuzanna    schedule 15.06.2018


Отговори (1)


Вярвам, че следното разрешава последната грешка, която получавате.
Моля, обърнете внимание, че това, което е важно в този отговор, е цикълът, а не точната структура на данните.

set.seed(1234)    # make the results reproducible
ONT.list <- list(data.frame(INTprice = rnorm(2)),
                 data.frame(INTprice = rnorm(4)),
                 data.frame(INTprice = rnorm(5)),
                 data.frame(INTprice = rnorm(20))
)

for(i in seq_along(ONT.list)){
  n <- nrow(ONT.list[[i]])
  d <- diff(ONT.list[[i]][["INTprice"]], lag = 4)
  ONT.list[[i]][["DiffInt"]] <- c(rep(NA, pmin.int(4, n - length(d))), d)
}

ONT.list
person Rui Barradas    schedule 15.06.2018
comment
Благодаря ти!! Имам кода, добавен в EDIT2 по-горе, но определено ще адаптирам вашия за други неща, които трябва да направя. Благодаря, че отделихте време да ми го напишете! - person Zuzanna; 15.06.2018