[英]R - Applying the Same Code to Multiple Columns
In my data cleansing, I have multiple dimension columns with a name in them that need to be aggregated by multiple metric columns.在我的数据清理中,我有多个维度列,其中包含需要由多个指标列聚合的名称。 The same code needs to be applied to my dimension columns.相同的代码需要应用于我的维度列。 I can easily enough copy and paste the same chunk of code ten times and change the column reference, however surely there is a simpler solution.我可以很容易地复制和粘贴相同的代码块十次并更改列引用,但是肯定有一个更简单的解决方案。
My research is leading me to believe I am missing something obvious with the sapply() function that I can't put my finger on.我的研究让我相信我在 sapply() function 中遗漏了一些我无法理解的明显东西。
Very basic reprex:非常基本的代表:
library(tidyverse)
player_1 <- c("Smith", "Adams", "Washington")
player_2 <- c("Johnson", "Jefferson", "Fuller")
player_3 <- c("Forman", "Hyde", "Kelso")
metric_1 <- 1:3
metric_2 <- 2:4
metric_3 <- 3:5
df <- data.frame(player_1, player_2, player_3, metric_1, metric_2, metric_3)
p1 <- df %>%
group_by(player_1) %>%
summarize_at(c("metric_1", "metric_2", "metric_3"), sum)
Is there a way to only have to type this "p1" code once but have R loop through my columns player_1, player_2, and player_3?有没有办法只需要键入这个“p1”代码一次,但让 R 循环通过我的列 player_1、player_2 和 player_3?
If I can provide more detail, please let me know.如果我能提供更详细的信息,请告诉我。
Couple of options:几个选项:
map
and iterate over each player individually.使用map
并分别迭代每个播放器。library(tidyverse)
cols <- paste0('player_', 1:3)
map(cols, ~df %>%
group_by(.data[[.x]]) %>%
summarise(across(starts_with('metric'), sum)))
#[[1]]
# A tibble: 3 x 4
# player_1 metric_1 metric_2 metric_3
#* <chr> <int> <int> <int>
#1 Adams 2 3 4
#2 Smith 1 2 3
#3 Washington 3 4 5
#[[2]]
# A tibble: 3 x 4
# player_2 metric_1 metric_2 metric_3
#* <chr> <int> <int> <int>
#1 Fuller 3 4 5
#2 Jefferson 2 3 4
#3 Johnson 1 2 3
#[[3]]
# A tibble: 3 x 4
# player_3 metric_1 metric_2 metric_3
#* <chr> <int> <int> <int>
#1 Forman 1 2 3
#2 Hyde 2 3 4
#3 Kelso 3 4 5
df %>%
pivot_longer(cols = starts_with('player')) %>%
group_by(name, value) %>%
summarise(across(starts_with('metric'), sum))
# name value metric_1 metric_2 metric_3
# <chr> <chr> <int> <int> <int>
#1 player_1 Adams 2 3 4
#2 player_1 Smith 1 2 3
#3 player_1 Washington 3 4 5
#4 player_2 Fuller 3 4 5
#5 player_2 Jefferson 2 3 4
#6 player_2 Johnson 1 2 3
#7 player_3 Forman 1 2 3
#8 player_3 Hyde 2 3 4
#9 player_3 Kelso 3 4 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.