#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"))