Применить as.numeri c к списку данных. - PullRequest
0 голосов
/ 23 января 2020

В настоящее время я учусь использовать R для простых финансовых расчетов. У меня есть семь фреймов данных, и я пытаюсь применить одну и ту же функцию ко всем из них. Имена векторов одинаковы для всех df, начинающихся с «Date», и изначально являются «chars». Мне удалось преобразовать каждый вектор "Дата" в формат даты с помощью:

listOf <- c(Invesco2, Lyxor1, Lyxor2, ComStage, Ossiam, SPDR, Vanguard) # list of dfs
for (i in listOf){
  i[1] <- as.Date(i[1], "%d-%m-%y")
}

Теперь я пытаюсь изменить остальные векторы на цифры c, снова используя a для l oop и " lapply ":

lapply(listOf, as.numeric)

Консоль просто печатает все векторы и выдает 37 ошибок:" В lapply (listOf, as.numeri c): NA введены с помощью принудительного обращения "

for (i in listOf){
  i <- as.numeric(i)
}

Опять 37 ошибок: в as.numeri c (i): NA введены по принуждению В обоих случаях ничего не изменилось. Pls help

РЕДАКТИРОВАТЬ: Существует пример набора данных:

# Create the sample vectors
Date <- c("23-01-19", "24-01-19", "25-01-19", "26-01-19", "27-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")

# Create df
InvescoDf <- data.frame(Date, Open, High, Low, Close, Adj_Close, Volume)

# Create another df
OssiamDf <- InvescoDf

# Put in list together
new_list <- list(InvescoDf, OssiamDf)

РЕДАКТИРОВАТЬ 2: Это создает факторы. В исходных данных векторами являются символы.

РЕДАКТИРОВАТЬ 3:

  Date     Open      High      Low       Close     `Adj Close` Volume
  <chr>    <chr>     <chr>     <chr>     <chr>     <chr>       <chr> 
1 23-01-19 69.849998 69.849998 69.849998 69.849998 69.849998   0     
2 24-01-19 69.440002 69.440002 69.440002 69.440002 69.440002   0     
3 25-01-19 69.540001 69.540001 69.540001 69.540001 69.540001   0     
4 28-01-19 70.32     70.32     70.32     70.32     70.32       0     
5 29-01-19 69.559998 69.559998 69.559998 69.559998 69.559998   0     
6 30-01-19 69.580002 69.580002 69.580002 69.580002 69.580002   0  

BR Тони

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Вот еще один вариант. Это берет список, преобразует дату в дату, а затем преобразует все, что является символом, в число c в списке фреймов данных.

library(tidyverse)

new_list %>%
  map(., 
         ~mutate(.x, Date = lubridate::dmy(Date)) %>%
           mutate_if(is.character, as.numeric)
      )
#> [[1]]
#>         Date  Open  High   Low Close Adj_Close Volume
#> 1 2019-01-23 69.85 69.85 69.85 69.85     69.85      0
#> 2 2019-01-24 69.44 69.44 69.44 69.44     69.44      0
#> 3 2019-01-25 69.54 69.54 69.54 69.54     69.54      0
#> 4 2019-01-26 70.32 70.32 70.32 70.32     70.32      0
#> 5 2019-01-27 69.56 69.56 69.56 69.56     69.56      0
#> 
#> [[2]]
#>         Date  Open  High   Low Close Adj_Close Volume
#> 1 2019-01-23 69.85 69.85 69.85 69.85     69.85      0
#> 2 2019-01-24 69.44 69.44 69.44 69.44     69.44      0
#> 3 2019-01-25 69.54 69.54 69.54 69.54     69.54      0
#> 4 2019-01-26 70.32 70.32 70.32 70.32     70.32      0
#> 5 2019-01-27 69.56 69.56 69.56 69.56     69.56      0
0 голосов
/ 23 января 2020

Если мы создаем list, используйте

listOf <- list(Invesco2, Lyxor1, Lyxor2, ComStage, Ossiam, SPDR, Vanguard) 

. Каждый data.frame внутри list также представляет собой list со столбцами равной длины, и as.numeric можно применить к векторы. Итак, нам нужно l oop над data.frame внутри list, т. Е. Необходим двойной lapply

new_list <- lapply(new_list, function(dat) {
            dat[[1]] <- as.Date(dat[[1]], "%d-%m-%y")
            dat[-1] <- lapply(dat[-1],  function(x) as.numeric(as.character(x)))
            dat
      })
str(new_list)
#List of 2
# $ :'data.frame':  5 obs. of  7 variables:
#  ..$ Date     : Date[1:5], format: "2019-01-23" "2019-01-24" "2019-01-25" "2019-01-26" ...
#  ..$ Open     : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ High     : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Low      : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Close    : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Adj_Close: num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Volume   : num [1:5] 0 0 0 0 0
# $ :'data.frame':  5 obs. of  7 variables:
#  ..$ Date     : Date[1:5], format: "2019-01-23" "2019-01-24" "2019-01-25" "2019-01-26" ...
#  ..$ Open     : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ High     : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Low      : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Close    : num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Adj_Close: num [1:5] 69.8 69.4 69.5 70.3 69.6
#  ..$ Volume   : num [1:5] 0 0 0 0 0

Или другой вариант

new_list <- lapply(new_list,  function(dat) {
                  dat <- type.convert(dat, as.is = TRUE)
                  dat[[1]] <- as.Date(dat[[1]], "%d-%m-%y")
                  dat
                })
names(new_list) <- c('InvescoDf', 'OssiamDf')
list2env(new_list, .GlobalEnv)
...