将向量重命名为向量名称和df名称之间的混合

时间:2020-01-26 19:47:16

标签: r loops dataframe vector rename

我正在学习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 托尼

1 个答案:

答案 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")