【问题标题】:Rename vector as a mix between vector name and name of the df将向量重命名为向量名称和 df 名称之间的混合
【发布时间】:2020-05-12 07:05:28
【问题描述】:

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

我的问题:

我设法遍历了一个数据框列表,并在每个数据框上创建了一个新列,将其称为“返回”。

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]))

到目前为止还不错。但现在我有一个向量名称为 Return、Return1 等的 DF。 是否有可能通过类似的迭代轻松重命名向量?:NameOfTheDataFrame_Return

提前谢谢你

BR 托尼

【问题讨论】:

    标签: r loops dataframe vector rename


    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 2018-03-25
      • 2020-10-18
      • 1970-01-01
      • 2022-10-15
      • 2012-07-31
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多