R вычислить новый столбец для нескольких фреймов данных с помощью функции-карты или цикла - PullRequest
0 голосов
/ 28 января 2019

У меня проблема с созданием нового столбца для нескольких фреймов данных с помощью функции карты или цикла for.У меня есть 25 фреймов данных с данными временного ряда криптовалюты:

ls(pattern="USD")
[1] "ADA.USD"   "BCH.USD"   "BNB.USD"   "BTC.USD"   "BTG.USD"   "DASH.USD"      "DOGE.USD"  "EOS.USD"   "ETC.USD"   "ETH.USD"   "IOT.USD"
[12] "LINK.USD"  "LTC.USD"   "NEO.USD"   "OMG.USD"   "QTUM.USD"  "TRX.USD"   "USDT.USD"  "WAVES.USD" "XEM.USD"   "XLM.USD"   "XMR.USD"
[23] "XRP.USD"   "ZEC.USD"   "ZRX.USD" 

Каждый объект - это фрейм данных, который обозначает криптовалюту, выраженную в долларах США.И каждый фрейм данных имеет 2 столбца: Дата и Закрытие (цена закрытия).Например: фрейм данных "BTC.USD" означает биткойн в долларах США:

head(BTC.USD)
# A tibble: 6 x 2
Date       Close
1 2015-12-31  430.
2 2016-01-01  434.
3 2016-01-02  434.
4 2016-01-03  431.
5 2016-01-04  433.

Теперь я хочу добавить третий столбец, который представляет дневной доход.

require(quantmod)
BTC.USD <- BTC.USD%>%mutate(Return= Delt(Close)*100)

Дляотдельный объект (в данном случае Биткойн [BTC.USD]), этот код работает так, как предполагалось:

> head(BTC.USD)
# A tibble: 6 x 3
  Date       Close Return[,"Delt.1.arithmetic"]
  <date>     <dbl>                        <dbl>
1 2015-12-31  430.                      NA     
2 2016-01-01  434.                       0.940 
3 2016-01-02  434.                      -0.0622
4 2016-01-03  431.                      -0.696 
5 2016-01-04  433.                       0.608 
6 2016-01-05  431.                      -0.489 

Теперь я хочу вычислить возврат для всех 25 фреймов данных (или криптовалют) с помощью функции карты илицикл for, но мой код не работает:

temp = ls(pattern=".USD")
map(.x= temp,.f = mutate(Return= Delt(Close)*100))

Ошибка в is.data.frame (.data) ||is.list (.data) ||is.environment (.data): отсутствует аргумент ".data" без значения по умолчанию

for (i in seq_along(temp)) {mutate(Return= Delt(Close)*100)}

Ошибка в is.data.frame (.data) ||is.list (.data) ||is.environment (.data): отсутствует аргумент ".data" без значения по умолчанию

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 28 января 2019

Во-первых, нам нужно получить данные в виде списка (каждый data.frame получит свою запись в списке).Затем мы можем использовать любую из наших итеративных функций списка, чтобы получить желаемый результат.

temp_data <- lapply(ls(pattern = "USD"), get) # get data into a list
temp_data2 <- lapply(temp_data, function(x) mutate(x, Return = Delt(Close)*100))

Как заметил @akrun, есть более компактный способ сделать это:

lapply(mget(ls(pattern = "USD")), transform, Return = Delt(Close) * 100)

Если вы хотите придерживаться tidyverse глаголов, это будет:

lapply(mget(ls(pattern = "USD")), function(x) x %>% mutate(Return = Delt(Close) * 100))

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

sdat1 <-structure(list(
      Date = c("2015-12-31","2016-01-01",
               "2016-01-02","2016-01-03","2016-01-04"),
      Close = c(430, 434, 434, 431, 433)),
    class = "data.frame",
    row.names = c("1", "2", "3", "4", "5"))

sdat4 <- sdat3 <- sdat2 <- sdat1

lapply(mget(ls(pattern = 'sdat')),
       FUN = function(x) x %>% mutate(Return = Delt(Close)))
...