【问题标题】:Add new variables using mutate by looping through a vector inside a for loop in r通过在 r 中的 for 循环内循环一个向量,使用 mutate 添加新变量
【发布时间】:2021-10-21 02:07:58
【问题描述】:

我正在使用一个数据集,它需要我为列添加上一年之前的数据。我想为一列和一列列表添加上一年的数据。这是我尝试过的,

Company = c("ABC", "ABC", "ABC", "XYZ", "XYZ", "XYZ", "KJF", "KJF", "KJF", "KJF")
Year = c(2021, 2020, 2019, 2017, 2018, 2019, 2020, 2019, 2021, 2018)
REC = c(100, 200, 300, 3000, 4000, 2000, 5000, 6000, 7000, 8000)
S   = c(1000, 2000, 3000, 300, 400, 200, 500, 600, 700, 800)
data = data.frame(Company, Year, REC, S, stringsAsFactors = FALSE)

fnames = c("REC", "S")
prevYear = 3

  for(i in 1:length(fnames)) {
  j = fnames[i]
  
  yrTmp = match(Year - prevYear, Year, nomatch = 0)
  data[, sprintf("PP%s", j)] = 
    data = data %>%
    group_by(Company) %>%
    mutate(data[, sprintf("PP%s", j)] = data[data[, j], yrTmp]) %>%
    ungroup 
  
  print(paste("PP", j, "calculated"))
  
  }

我想使用此循环将前一年的数据添加到 REC 和 S。将来我想使用这个循环添加 40 多个变量。如何使用 for 循环实现它? 这是所需的输出,

【问题讨论】:

  • 你能添加你想要的输出吗!我觉得不使用任何循环就可以做到这一点
  • 我已经添加了所需的输出。

标签: r for-loop dplyr


【解决方案1】:

您可以使用across 将函数应用于多个列。

library(dplyr)

data %>%
  group_by(Company) %>%
  mutate(across(all_of(fnames), ~.[match(Year - prevYear, Year)], 
         .names = 'PP_{col}')) %>%
  ungroup

【讨论】:

  • 感谢您的解决方案。我试图在我的环境中运行它,但它没有给我正确的列名。我会努力解决这个问题。
  • 这确实为共享的数据提供了预期的输出,因此在您的实际数据中可能会有一些不同。
  • 是的,但列名已正确填充。
  • 如果您不想在名称中使用下划线,您可以将 .names = 'PP_{col} 更改为 .names = 'PP{col}
  • 但列名未正确填充。我得到这样的答案,PP_.col。和不适用。但我希望它是 PPREC 和 PPS。
猜你喜欢
  • 2021-12-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多