【问题标题】:Using For loops in R to apply same function to several variables in a data frame在 R 中使用 For 循环将相同的函数应用于数据框中的多个变量
【发布时间】:2021-04-25 01:18:58
【问题描述】:

我正在尝试跨数据框中的多个变量应用函数。下面是我正在尝试做的一个示例。

#Creating data frame
df <- data.frame (Year = c(1,2,3),
                  "Revenue_change" = c(0.43, 0.56, 0.48),
                  "Costs_change" = c(0.31, 0.41, 0.39))

#Create vector to use for loop
var <- c("Revenue_change", "Costs_change")

#Using loop to put revenue and cost in percentage terms (multiplying by a 100)
for (v in var) { 
 df <- df %>% 
    mutate(v = v * 100)
  }

我将在一个更大的数据框中将这个应用于多个变量,因为我无法让这个循环在我的主数据集中工作,我目前有非常重复的代码,如下所示:

KPI <- KPI %>% 

  #Total sales
  mutate(Rank_sales = rank(desc(`Total Sales_% Var`))) %>% 
  mutate(Points_sales = (n() - (Rank_sales - 1)) * 10) %>% 
  
  #Donated sales
  mutate(Rank_donated = rank(desc(`Donated Sales_% Var`))) %>% 
  mutate(Points_donated = (n() - (Rank_donated - 1)) * 10) %>% 
  
  #New good sales
  mutate(Rank_new = rank(desc(`New Goods Sales_% Var`))) %>% 
  mutate(Points_new = (n() - (Rank_new - 1)) * 10) %>% 
  
  #Gift aid
  mutate(Rank_gift = rank(desc(`Gift Aid_%`))) %>% 
  mutate(Points_gift = (n() - (Rank_gift - 1)) * 10) %>% 
  
  #Net profit
  mutate(Rank_net = rank(desc(`Net Profit_£ Var`))) %>% 
  mutate(Points_net = (n() - (Rank_net - 1)) * 10) %>% 

  #Volunteer
  mutate(Rank_volunteer = rank(desc(`Volunteer Hrs_for every £1k Sales`))) %>% 
  mutate(Points_volunteer = (n() - (Rank_volunteer - 1)) * 10)

希望循环或应用函数有助于减少当前代码的重复性。

【问题讨论】:

  • 我不清楚您的代码的第一部分与第二部分的关系。但要给出一个指针,我会使用tidyr::pivot_longer() 将数据从宽调整为长,然后使用group_by() 对每组变量进行计算,然后您只需要应用一次 mutate 调用。 (另请注意,您不需要对单个转换使用 mutate,您可以在同一个 mutate 调用中应用它们)。
  • 第一个示例只是提供具有可重现数据的内容,而第二个摘录显示了我的实际代码示例。我知道使用group_by,但我更喜欢这样的解决方案,它可以跨多个变量应用函数,而不必重塑这些数据,因为我使用 Leaflet 包进行地理映射,并且使用宽数据效果更好。
  • 生成的数据只有在使后续代码可重现时才有用。

标签: r loops dplyr apply


【解决方案1】:

如果没有你的实际数据样本,很难测试它是否真的有效,但这样的事情应该有效:

myvars <- c("Total Sales_% Var", "Donated Sales_% Var", "New Goods Sales_% Var", "Gift Aid_%", "Net Profit_£ Var", "Volunteer Hrs_for every £1k Sales")

Points_fun <- function(x) {
  rank_var <- rank(desc(x))
  (n() - (rank_var - 1)) * 10)
}

mutate(KPI, across(all_of(myvars), ~ rank(desc(.x)), .names = "Rank_{.col}"),
       across(all_of(myvars), Points_fun, .names = "Points_{.col}"))

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2020-02-25
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2022-01-03
    • 2011-02-17
    相关资源
    最近更新 更多