【问题标题】:How to use for loop to create new data frames using i in the name of data frame in R如何使用for循环在R中的数据框名称中使用i创建新的数据框
【发布时间】:2021-01-09 22:08:53
【问题描述】:

我对 R 比较陌生,并且一直在此论坛中搜索示例。虽然我找到了一些类似的问题和答案,但我似乎仍然无法让我的代码工作。

我想在 R 中使用 for 循环来创建一系列新数据帧,这些数据帧将 i 的临时值合并到新数据帧的名称中。我有以下代码,我想在其中创建两个新数据框:metrics_2013 和 metrics_2014。我有一些计算(变异和过滤)要应用于新的数据帧,但为了简单起见,我将其排除在外。

yearlist <- as.list(c(2013, 2014))
metrics_ <- data.frame(matrix(ncol = 4, nrow = 0))
for (i in yearlist) {
  
  maxyear <- i
  minyear <- maxyear - 7
  
metrics_[as.character(i)] <- mutatedata %>% 
  group_by(symbol) %>% 
  filter(year>=minyear & year<=maxyear) %>% 
  summarize(
    avgroepercent = mean(roe,na.rm = TRUE), 
    avgrocpercent = mean(roc, na.rm = TRUE),
    epsroc = (((last(eps))/(first(eps)))^(1/(maxyear-minyear))-1)
    )
}

在这种情况下,两个数据帧(对于 2013 年和 2014 年)都将等于“数据”,因为我目前遇到的所有问题是创建名称基于 i 值的数据帧。我相信它可能与[],vs [[]]有关,或者我需要在for循环之前定义metrics_[i]???但非常感谢任何帮助!!!

【问题讨论】:

    标签: r dataframe loops


    【解决方案1】:

    稍微不同的做法会简单得多并且从长远来看会让你的生活更轻松。与其拥有多个具有自动生成名称的变量,不如拥有一个其元素具有自动生成名称的列表。例如:

    data <- data.frame(a=1:2)
    
    metrics <- list()
    for (i in yearlist) {
      metrics[as.character(i)] <- data
    }
    

    (可能有比循环更好的方法,但这是另一个话题)

    【讨论】:

    • 感谢您的快速回复 MattB!是的,我知道循环可能不是最佳选择。但是我正在尝试在学习 R 时采取一些小步骤:) 我尝试运行您的代码,但出现此错误“度量 [as.character(i)]
    • 你给data变量赋值了吗? :-)
    • 是的,这是一个数据框,我将使用它来执行一系列计算,但我想先创建数据框......所以回答你的问题, 是的。但这可能不是您希望在您的代码集中出现的内容???
    • 仅供参考 - 我打算使用此代码执行的操作是使用:group_by、过滤和汇总来对“数据”数据帧执行一系列计算。这些名称中包含 2013 和 2014 的新数据框定义了要在汇总函数中使用的信息子集。
    • 查看我的编辑。如果您已将某些内容分配给 data,那么您应该不会收到该错误。
    【解决方案2】:

    你可以试试:

    library(dplyr)
    yearlist <- c(2013, 2014)
    
    lapply(yearlist, function(x) {
      maxyear <- x
      minyear <- maxyear - 7
      
      mutatedata %>% 
        filter(year>=minyear & year<=maxyear) %>% 
        group_by(symbol) %>% 
        summarize(
          avgroepercent = mean(roe,na.rm = TRUE), 
          avgrocpercent = mean(roc, na.rm = TRUE),
          epsroc = (((last(eps))/(first(eps)))^(1/(maxyear-minyear))-1)
        )
    }) -> data
    

    其中data 是数据帧列表。如果你想创建单独的数据框,你可以使用list2env。

    names(data) <- paste0('metrics_', yearlist)
    list2env(data, .GlobalEnv)
    

    【讨论】:

    • 使用 lapply 效果很好。非常感谢@Ronak Shah。第二个问题出现了。现在我想做一个 left_join 或合并以从第二个数据框中添加一列信息。我们称这个新数据框为:Industry。我只想添加一列,从该数据框中提取行业数据并将其添加到上面创建的每个新数据框中。我试过做一个简单的循环,如下所示: for (i in yearlist) {calcmetrics_[[i]]
    • 我能够回答我自己的问题。我使用了 map 函数,它可以在我使用上面的 lapply 创建的列表中使用 left_join。 map(data, ~data.frame(.) %>% 然后 left_join.
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2016-05-09
    • 1970-01-01
    • 2014-03-31
    • 2021-08-01
    相关资源
    最近更新 更多