#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. Большое вам спасибо!