#r #purrr
#r #purrr
Вопрос:
Я хочу разделить несколько столбцов фрейма данных на столбец того же фрейма данных (чтобы получить проценты). Я хотел бы сделать это с помощью purrr, чтобы иметь возможность повторять операцию для каждого столбца, и я попытался сделать это следующим образом, но потерпел неудачу.
#create the tibble
competitor_a <- c(125,300,250)
competitor_b <- c(321,452,366)
competitor_c <- c(231,271,139)
data <- tibble(competitor_a,competitor_b,competitor_c)
data <- data %>%
mutate(total_sales=sum(competitor_a,competitor_b,competitor_c))
#iteration
data %>%
map(select(competitor_a,competitor_b,competitor_c)/total_sales))
где data
находится мой фрейм данных, competitor_a, competitor_b, competitor_c
столбцы с продажами конкурентов (дивиденды) и total_sales
мой разделитель.
Ответ №1:
В этом случае я думаю, что лучше использовать across
:
library(dplyr)
data <- data %>% mutate(across(competitor_a:competitor_c, `/`, total_sales))
Это также можно сделать с помощью base R :
data[1:3] <- data[1:3]/data$total_sales
Ответ №2:
Ваша total_sales
колонка неверна. Поскольку вы суммируете по строкам, вам нужно выполнить следующее (используя dplyr
):
data <- data %>%
rowwise() %>%
mutate(total_sales = sum(c_across(everything())))
Что касается карты, то одним из способов является использование анонимной функции:
data %>%
map_dfr(~.x/data$total_sales*100) %>%
select(-total_sales)
# A tibble: 3 x 3
competitor_a competitor_b competitor_c
<dbl> <dbl> <dbl>
1 9.23 23.7 17.1
2 14.7 22.1 13.2
3 16.6 24.2 9.21