Сохранить последние n символов ячеек в функции в R

#r #function

#r #функция

Вопрос:

Рассмотрим следующие данные.frame:

 df <- setNames(data.frame(rep("text_2010"),rep(1,5)), c("id", "value"))
 

Я хочу сохранить только 4 последних символа ячеек в столбце «id». Поэтому я могу использовать следующий код:

 df$id <- substr(df$id,nchar(df$id)-3,nchar(df$id))
 

Однако я хочу создать функцию, которая делает то же самое. Поэтому я создаю следующую функцию и применяю ее:

 testfunction <- function(x) {
  x$id <- substr(x$id,nchar(x$id)-3,nchar(x$id))
}

df <- testfunction(df)
 

Но я не получаю тот же результат. Почему это так?

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

1. Добавьте return(x) свою функцию.

Ответ №1:

Добавьте return(x) в свою функцию, чтобы вернуть измененный объект.

 testfunction <- function(x) {
  x$id <- substr(x$id,nchar(x$id)-3,nchar(x$id))
  return(x)
}

df <- testfunction(df)
 

Однако вам не всегда нужен явный return оператор (хотя лучше иметь его). R по умолчанию возвращает последнюю строку в вашей функции, поэтому здесь вы также можете сделать

 testfunction <- function(x) {
  transform(x, id = substring(id, nchar(id)-3))
}

df <- testfunction(df)
 

которая должна работать так же.

Ответ №2:

Мы также можем создать функцию, которая принимает аргумент n (в противном случае функция была бы статической для n и полезной только как динамическая функция для разных данных) и создает шаблон регулярных выражений для использования с sub

 testfunction <- function(x, n) {
     pat <- sprintf(".*(%s)$", strrep(".", n))
     x$id <- sub(pat, "\1", x$id)
  return(x)
 }
 

-тестирование

 testfunction(df, n = 4)
#     id value
#1 2010     1
#2 2010     1
#3 2010     1
#4 2010     1
#5 2010     1
 

Ответ №3:

Базовое решение R, пытающееся отразить RIGHT() функцию Excel:

 # Function to extract the right n characters from each element of a provided vector: 
right <- function(char_vec, n = 1){
  # Check if vector provided isn't of type character: 
  if(!is.character(char_vec)){
    # Coerce it, if not: char_vec => character vector
    char_vec <- vapply(char_vec, as.character, "character")
  }
  # Store the number of characters in each element of the provided vector: 
  # num_chars => integer vector
  num_chars <- nchar(char_vec)
  # Return the right hand n characters of the string: character vector => Global Env() 
  return(substr(char_vec, (num_chars   1) - n, num_chars))
}

# Application: 
right(df$id, 4)
 

Данные:

 df <- setNames(data.frame(rep("text_2010"),rep(1,5)), c("id", "value"))