Я даю три аргумента: ввод df, столбец, который я хочу очистить, новый столбец, который я хочу добавить с очищенными именами.Куда я иду не так? - PullRequest
0 голосов
/ 22 марта 2019
library(dplyr)
clean_name <- function(df,col_name,new_col_name){

 #remove whitespace and common titles.
 df$new_col_name <- mutate_all(df, 
                  trimws(gsub("MR.?|MRS.?|MS.?|MISS.?|MASTER.?","",df$col_name)))

 #remove any chunks of text where a number is present
 df$new_col_name<- transmute_all(df,
                  gsub("[^\\s]*[\\d]+[^\\s]*","",df$col_name,perl = TRUE))

}

Я получаю следующую ошибку

«Ошибка: столбец new_col_name должен быть 1d атомарным # вектором или списком»

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

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

Функция mutate сама должна делать то, что вы хотите, она возвращает тот же фрейм данных, но с новым столбцом:

     library(dplyr)
     clean_name <- function(df, col_name, new_col_name) {

     # first_cleaning_to_colname = The first change you want to make to the col_name column. This should be a vector.
     # second_cleaning_to_colname = The change you're going to make to the col_name column after the first one. This should be a vector too.

     first_change <- mutate(df, col_name = first_cleaning_to_colname)

     second_change <- mutate(first_change, new_col_name = second_cleaning_to_colname)

     return(second_change)
     }

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

0 голосов
/ 22 марта 2019

Если мы передаем имена столбцов без кавычек, используйте

library(tidyverse)
clean_name <- function(df,col_name, new_col_name){
   col_name <- enquo(col_name)
  new_col_name <- enquo(new_col_name)
   df %>% 
     mutate(!! new_col_name := 
     trimws(str_replace_all(!!col_name, "MR.?|MRS.?|MS.?|MISS.?|MASTER.?","")) ) %>%
     transmute(!! new_col_name := trimws(str_replace_all(!! new_col_name, 
              "[^\\s]*[\\d]+[^\\s]*","")))
     }


clean_name(dat1, col1, colN) 
#   colN
#1  one
#2  two

данные

dat1 <- data.frame(col1 = c("MR. one", "MS. two 24"), stringsAsFactors = FALSE)
...