rename_if() вместе с start_with() для префикса определенных столбцов

Мои данные выглядят так:

#>           Artist          Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971

И мой вопрос должен быть довольно простым. Я пытаюсь использовать rename_if для префикса только тех столбцов, которые начинаются с буквы «А». Итак, мой желаемый результат:

#>       df1_Artist      df1_Album Year
#> 1        Beatles  Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971

Вы можете видеть, что «Год» не должен иметь префикса.

Это моя попытка, но она не совсем работает. Я неправильно использую starts_with? Должен ли я попытаться разбить его на две строки, чтобы я мог понять его более четко? Функции стиля мурлыканья я все еще изучаю, поэтому они не всегда интуитивно понятны для меня.

df1 %>% rename_if(starts_with("A"), .funs = ~ paste0(df1, .))
#> Error in df1 %>% rename_if(starts_with("A"), .funs = ~paste0(df1, .)): could not find function "%>%"

Код для ввода данных:

df1 <- data.frame(stringsAsFactors=FALSE,
      Artist = c("Beatles", "Rolling Stones"),
       Album = c("Sgt. Pepper's", "Sticky Fingers"),
        Year = c(1967, 1971)
)

person Jeremy K.    schedule 21.06.2019    source источник


Ответы (2)


rename_if ожидает логический вектор в качестве предикатной функции. starts_with выбирает переменные на основе их имени. Вместо этого используйте базу startsWith, которая возвращает логический вектор на основе префикса.

library(dplyr)
df1 %>% rename_if(startsWith(names(.), "A"), ~paste0("df1_", .))

#      df1_Artist      df1_Album Year
#1        Beatles  Sgt. Pepper's 1967
#2 Rolling Stones Sticky Fingers 1971

Или, если вы хотите остаться в tidyverse, вы также можете использовать str_detect

df1 %>% rename_if(stringr::str_detect(names(.), "^A"), ~paste0("df1_", .))

Чтобы использовать starts_with, мы можем использовать rename_at с аргументом vars.

df1 %>% rename_at(vars(starts_with("A")), ~paste0("df1_", .))
person Ronak Shah    schedule 21.06.2019
comment
Это редактирование очень помогло мне объяснить разницу между rename_at и rename_if. Раньше я никогда не понимал разницы. Спасибо. - person Jeremy K.; 21.06.2019
comment
Кстати, вы рекомендуете мне какой-либо конкретный источник для изучения таких вещей, как rename_at и rename_if и функции мурлыканья? Будет ли мне лучше всего работать с Hadley R4DS? - person Jeremy K.; 21.06.2019
comment
@RAndStata К сожалению, я не буду лучшим человеком, чтобы ответить на этот вопрос, потому что я не читал большую часть ресурсов в Интернете. Мои знания в основном получены из чтения ответов других людей здесь и проверки документации функций при попытке ответить на вопросы. - person Ronak Shah; 21.06.2019

Мы можем использовать

library(tidyverse)
df1 %>%
  rename_at(vars(starts_with("A")), ~ str_c("df1_", .))
#     df1_Artist      df1_Album Year
#1        Beatles  Sgt. Pepper's 1967
#2 Rolling Stones Sticky Fingers 1971
person akrun    schedule 21.06.2019