R使用映射函数或循环计算多个数据帧的新列
R calculate a new column for multiple dataframes with a map-function or a loop
我在使用映射函数或 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 列:日期和收盘价(收盘价)。例如:dataframe "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.
现在我想添加第三列,代表每日return。
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
现在我想用映射函数或 for 循环计算所有 25 个数据帧(或加密货币)的 return,但我的代码不起作用:
temp = ls(pattern=".USD")
map(.x= temp,.f = mutate(Return= Delt(Close)*100))
Error in is.data.frame(.data) || is.list(.data) || is.environment(.data) :
argument ".data" is missing, with no default
for (i in seq_along(temp)) {mutate(Return= Delt(Close)*100)}
Error in is.data.frame(.data) || is.list(.data) || is.environment(.data) :
argument ".data" is missing, with no default
有人可以帮助我吗?
首先,我们需要以列表的形式实际获取数据(每个 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)))
我在使用映射函数或 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 列:日期和收盘价(收盘价)。例如:dataframe "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.
现在我想添加第三列,代表每日return。
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
现在我想用映射函数或 for 循环计算所有 25 个数据帧(或加密货币)的 return,但我的代码不起作用:
temp = ls(pattern=".USD")
map(.x= temp,.f = mutate(Return= Delt(Close)*100))
Error in is.data.frame(.data) || is.list(.data) || is.environment(.data) : argument ".data" is missing, with no default
for (i in seq_along(temp)) {mutate(Return= Delt(Close)*100)}
Error in is.data.frame(.data) || is.list(.data) || is.environment(.data) : argument ".data" is missing, with no default
有人可以帮助我吗?
首先,我们需要以列表的形式实际获取数据(每个 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)))