Добавление в столбцы с вставкой в ​​mutate_at - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующие тестовые данные:

structure(list(testcode = structure(1:3, .Label = c("1", "20", 
"300"), class = "factor"), testname = structure(c(2L, 3L, 1L), .Label = c("Bed", 
"Book", "Car"), class = "factor")), .Names = c("testcode", "testname"
), row.names = c(NA, -3L), class = "data.frame")

У меня есть функция, которая идентифицирует конкретное имя столбца, а затем добавляет начальный ноль к переменным в этом столбце в виде символа. (Все столбцы символьные). Поскольку переменные столбца в столбце «код» имеют переменную длину, я подумал, что проще всего использовать paste0 как paste0("0",column_name).

Функция выглядит следующим образом:

library(dplyr)

fix_codes <- function(df) {
  code_column <- grep("code$", colnames(df), value = TRUE)

  df <- df %>%
    mutate_at(.vars = code_column, .funs = funs(paste0("0",code_column)))
  return(df)
}

Однако paste0, похоже, не понимает, что я хочу вставить столбец, который указан в code_column, а не сам кодовый_колон, как сейчас. Как сделать так, чтобы paste0 распознал это правильно?

Что я хочу закончить:

testcode   testname
01         Book
020        Car
0300       Bed

1 Ответ

0 голосов
/ 16 мая 2018

Вместо этого мы можем использовать ., чтобы применить paste к фактическим значениям выбранных столбцов

fix_codes <- function(df) {
   code_column <- grep("code$", colnames(df), value = TRUE)
   df <- df %>%
       mutate_at(.vars = code_column, .funs = funs(paste0("0",.)))
   return(df)
}

df

#  testcode testname
#1        1     Book
#2       20      Car
#3      300      Bed

fix_codes(df)
#  testcode testname
#1       01     Book
#2      020      Car
#3     0300      Bed

Также эквивалентный базовый подход R с использованием lapply будет таким, где мы выбираем столбцынапрямую

df[grep("code$", colnames(df))][] <- 
         lapply(df[grep("code$", colnames(df))], function(x) paste0("0", x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...