【问题标题】:How do I add new columns to a dataframe repeatedly in R with new names?如何在 R 中使用新名称重复向数据框添加新列?
【发布时间】:2020-05-18 22:45:08
【问题描述】:

我有一个名为 xlong_gwTCE_3 的数据框

格式如下:

  V1 study_id year mean_gwTCE index_year
  1  0000001 2010          .3       2016 
  2  0000001 2002          .6       2016
  3  0000002 2011          .2       2014
  4  0000002 2005          .4       2014
  5  0000002 2013          .8       2014
  6  0000003 2004          .1       2017

我想对其重复执行操作并将结果存储在新列中。

这是我尝试过的,应该更清楚:

time_intervals <- seq(5,25,by=5)

for (years_back in time_intervals) {

  gwTCE_cumsum <- xlong_gwTCE_3%>% 
    mutate(index_yr_minus_years_back = index_year-years_back) %>% 
    filter(year >= index_yr_minus_years_back & year <= index_year) %>% 
    group_by(study_id) %>% 
    summarize(mean_gwTCE = sum(mean_gwTCE, na.rm=T))
}

问题是我需要其他列的名称基于years_back 的数量。

例如,创建的第一列可以命名为gwTCE_cumsum_5,创建的第二列可以命名为gwTCE_cumsum_10。

现在它不是每次都创建额外的列或重命名它们。

我一直在尝试使用粘贴功能尝试以这样的方式重命名列

gwTCE_cumsum <- paste("gwTCE_cumsum", years_back, sep="_")

但它一直没有工作。

我正在寻找的输出看起来像这样:

  V1 study_id year mean_gwTCE index_year gwTCE_cumsum_5 gwTCE_cumsum_10 gwTCE_cumsum_15 
  1  0000001 2010          .3       2016  0              .3               .9
  2  0000002 2011          .2       2014  .2             .6               .6
  3  0000003 2004          .1       2017  .1             .1               .1

感谢您的帮助。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    我们可以使用:= 和paste 来创建新列

     for (years_back in time_intervals) {
    
       out <- xlong_gwTCE_3%>% 
         mutate(index_yr_minus_years_back = index_year-years_back) %>% 
          filter(year >= index_yr_minus_years_back & year <= index_year) %>% 
           group_by(study_id) %>% 
           summarize(mean_gwTCE = sum(mean_gwTCE, na.rm=T)) %>%
            mutate(!! str_c("gwTCE_cumsum", years_back, sep="_") := cumsum(mean_gwTCE))
        }
    

    或者使用map

    library(purrr)
    library(dplyr)
    library(stringr)
    map(time_intervals, ~ xlong_gwTCE_3 %>%
               filter(year >= index_year - .x, year <= index_year) %>%
               group_by(study_id) %>%
               summarise(index_year = index_year[1], 
                           mean_gwTCE = sum(mean_gwTCE, na.rm = TRUE)) %>%
               mutate(!!str_c("gwTCE_cumsum", .x, sep = "_") := cumsum(mean_gwTCE)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2021-10-04
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多