繁体   English   中英

如何使用新名称在 R 中重复向 dataframe 添加新列?

[英]How do I add new columns to a dataframe repeatedly in R with new names?

我有一个名为 xlong_gwTCE_3 的 dataframe

它的格式如下:

  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

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

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

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

但它一直没有工作。

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

  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

谢谢您的帮助。

我们可以使用:=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)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM