【发布时间】: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 包进行地理映射,并且使用宽数据效果更好。 -
生成的数据只有在使后续代码可重现时才有用。