簡體   English   中英

R使用map-function或loop計算多個數據幀的新列

[英]R calculate a new column for multiple dataframes with a map-function or a loop

我在使用map函數或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 

現在我想用map函數或for循環計算所有25個數據幀(或加密貨幣)的回報,但我的代碼不起作用:

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”,沒有默認值

有人能幫我嗎?

首先,我們需要實際將數據作為列表獲取(每個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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM