обобщите мутацию на все столбцы тиббла

#r #tidyverse #purrr #quasiquotes

Вопрос:

Я хотел бы обобщить эту строку кода на все столбцы tibble:

 starwars_with_species_as_last_column lt;- starwars %gt;%   select(1:11) # not interested in generalising this  starwars_with_species_as_last_column %gt;%   transmute(text = str_c("gender_", gender, " homeworld_", homeworld, "n", species))  

Поэтому я думаю о функции, которая принимает в качестве входных данных tibble с n столбцами и применяет n-1 раз некоторую комбинацию col1name_col1content, col2name_col2content и в последний раз другую комбинацию с последним столбцом.

Я думаю, что смогу сделать это с помощью традиционного оператора if, повторяющего все столбцы. Но было бы гораздо приятнее сделать это в стиле tidyverse. Я полагаю purrr , что это необходимо здесь, но я не могу заставить это работать.

Кроме того, мне, безусловно, нужна квазикавычка, чтобы каждый раз получать имя столбца перед содержимым столбца, например, gender_masculine.

Комментарии:

1. Я думаю across , что пользовательская функция должна дать вам то, что вы хотите.

2. Спасибо, дай мне попробовать

Ответ №1:

Вот возможный подход с использованием gather и paste :

 starwars %gt;%  select(1:11) %gt;%  mutate(row = 1:n()) %gt;%   gather(coln, value, -row) %gt;%  group_by(row) %gt;%  summarise(  text = paste(  paste(coln[-n()], value[-n()], sep = "_", collapse = "_"),   "n",  paste(last(coln), last(value), sep = "_")  )  )  

Комментарии:

1. Большое вам спасибо!