我正在学习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)
我的问题:
我设法遍历数据帧列表,并在每个数据帧列表上创建了一个新列,称为“ Return”。
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 托尼
答案 0 :(得分:1)
OP的“ mylist”列均为factor
类。因此,我们需要首先将type
转换为type.convert
,如果打算只返回特定的列,请使用transmute
而不是mutate
。
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")