Как использовать карту purrr со столбцами из фрейма данных?

#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