Переименовать вектор как смесь имени вектора и имени df - PullRequest
1 голос
/ 26 января 2020

Я изучаю R, так что спасибо вам за терпение. Сначала приведу пример моих данных:

Date <- c("23-01-19", "24-01-19", "25-01-19",  "30-01-19", "31-01-19" )
Open <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
High <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Low <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Close <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Adj_Close <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Volume <- c("0", "0", "0", "0","0")
InvescoDf <- data.frame(Date, Open, High, Low, Close, Adj_Close, Volume)
OssiamDf <- InvescoDf
mylist <- list(InvescoDf, OssiamDf)

Моя проблема:

Мне удалось перебрать список фреймов данных и создать для каждого столбца новый столбец, назвав его «Возврат».

new_list <- lapply(mylist, function(x) 
{
  x <- mutate(x, Return = (Close / lag(Close, default = first(Close)))-1)
  x
})

Следующим моим шагом будет выбор всех векторов возврата (8-й столбец) и создание DF:

new_Df <- data.frame(sapply(new_list, function(x) x[, 8]))

Пока отлично. Но теперь у меня был бы DF, где имена векторов были Return, Return1 и так далее. Есть ли возможность легко переименовать векторы с помощью итерации в нечто подобное ?: NameOfTheDataFrame_Return

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

BR Тони

1 Ответ

1 голос
/ 26 января 2020

Все столбцы «mylist» ОП были factor класса. Итак, нам нужно сначала преобразовать type в type.convert, использовать transmute вместо mutate, если мы хотим вернуть только указанный c столбец.

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

library(dplyr)
library(purrr)
library(stringr)
mylist <- lst(InvescoDf, OssiamDf) # now it is named

Или с кодом OP

names(mylist) <- c("InvescoDf", "OssiamDf")

В этом случае мы можем использовать imap, где .y возвращает имена набора данных

imap_dfc(mylist, ~ type.convert(.x, as.is = TRUE) %>%
          transmute(!! str_c(.y, '_Return') := 
              (Close / lag(Close, default = first(Close)))-1))
#  InvescoDf_Return OssiamDf_Return
#1      0.000000000     0.000000000
#2     -0.005869664    -0.005869664
#3      0.001440078     0.001440078
#4      0.011216551     0.011216551
#5     -0.010807765    -0.010807765

В base R мы можем сделать

out2 <- data.frame(lapply(mylist, function(dat) {
              dat <- type.convert(dat, as.is = TRUE)
              with(dat, (Close / lag(Close, default = first(Close)))-1)


       }))
names(out2) <- paste0(names(out2), "_Return")
...