Скользящая колонка вычитания из Dataframe - PullRequest
0 голосов
/ 13 июня 2019

У меня есть такой фрейм данных:

library(lubridate)
set.seed(23) 

date_list = seq(ymd('2000-01-15'),ymd('2010-09-18'),by='day')
testframe = data.frame(Date = date_list)
testframe$Day = substr(testframe$Date, start = 6, stop = 10)
testframe$ABC = rnorm(3900)
testframe$DEF = rnorm(3900)
testframe$GHI = seq(from = 10, to = 25, length.out = 3900)
testframe$JKL = seq(from = 5, to = 45, length.out = 3900)

Я хочу иметь автоматическое скользящее подмножество этого кадра данных, которое должно быть таким:

testframe_ABC = testframe[,c("Date","Day","ABC")]
testframe_DEF = testframe[,c("Date","Day","DEF")]
testframe_GHI = testframe[,c("Date","Day","GHI")]
testframe_JKL = testframe[,c("Date","Day","JKL")]

Столбцы Дата и День должны всегда оставаться, остальные столбцы должны добавляться индивидуально. Имя изменяющегося столбца должно быть добавлено к имени файла данных, чтобы иметь новый df. Все кадры данных также могут быть в списке кадров данных, если это возможно.

Есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Вы можете использовать split.default для разделения на каждый столбец, а затем cbind первые 2 столбца для каждого элемента, то есть

lapply(split.default(testframe[-c(1, 2)], seq_along(testframe)[-c(1, 2)]), function(i)
                                                cbind.data.frame(testframe[c(1, 2)], i))

, который дает список,

$`3`
        Date   Day        ABC
1 2000-01-15 01-15  0.1932123
2 2000-01-16 01-16 -0.4346821
3 2000-01-17 01-17  0.9132671

$`4`
        Date   Day       DEF
1 2000-01-15 01-15 1.7933881
2 2000-01-16 01-16 0.9966051
3 2000-01-17 01-17 1.1074905

$`5`
        Date   Day  GHI
1 2000-01-15 01-15 10.0
2 2000-01-16 01-16 17.5
3 2000-01-17 01-17 25.0

$`6`
        Date   Day JKL
1 2000-01-15 01-15   5
2 2000-01-16 01-16  25
3 2000-01-17 01-17  45

ИСПОЛЬЗОВАННЫЕ ДАННЫЕ

dput(testframe)
structure(list(Date = structure(c(10971, 10972, 10973), class = "Date"), 
    Day = c("01-15", "01-16", "01-17"), ABC = c(0.193212333898146, 
    -0.434682108206693, 0.913267096589322), DEF = c(1.79338809206353, 
    0.996605106833546, 1.10749048744809), GHI = c(10, 17.5, 25
    ), JKL = c(5, 25, 45)), row.names = c(NA, -3L), class = "data.frame")
1 голос
/ 13 июня 2019

Я предполагаю, что вам нужен список из 4 фреймов данных, компоненты которых ABC, DEF и т. Д. Было бы лучше поместить их в список:

L <- Map(function(nm) testframe[c("Date", "Day", nm)], names(testframe)[-(1:2)])

, в этом случае L$ABC или L[[1]] будет ссылаться на фрейм данных ABC, но если вы хотите оставить их висящими в глобальной среде, это скопирует в него компоненты списка:

list2env(L, .GlobalEnv)

Я бы не использовал термин rolling в этом контексте. Обычно этот термин относится к скользящему окну, например:

library(zoo)
rollmeanr(1:10, 3)  # 2 is mean of 1:3, 3 is mean of 2:4, etc.
## [1] 2 3 4 5 6 7 8 9
...