Функция R для замены значений в заданном диапазоне столбцов

#r #dataframe #replace

#r #фрейм данных #заменить

Вопрос:

У меня есть шкала Лайкерта в диапазоне от 1 до 5, но в моей базе данных опроса я допустил ошибку, обозначив ответы как A1: A5.

 `> dput(head(sample))
structure(list(ESIR_SQ001 = c(NA, "A4", 
"A4", "A3", "A3", NA), 
 ESIR_SQ002 = c(NA, "A2", "A4", "A3", "A4", 
 NA), ESIR_SQ003 = c(NA, 
 "A2", "A2", "A2", "A2", NA), ESIR_SQ004 = 
 c(NA, "A1", "A2", 
 "A3", "A1", NA)), class = c("tbl_df", 
 "tbl", "data.frame"
  ), row.names = c(NA, -6L))`
  

У меня есть несколько масштабов и тысячи участников, поэтому мне интересно, есть ли способ замены значений в диапазоне переменных моего фрейма данных:

пример из столбца 1:5 (A1= 1, A2=2, A3=3, A4= 4, A5=5)

Ответ №1:

Мы можем принудительно использовать integer после преобразования в factor с levels , указанным в пользовательском заказе. Это был бы простой подход.
Поскольку входным набором данных является a tibble , мы можем использовать tidyverse подходы.

 library(dplyr)
Sample <- Sample %>%
     mutate(across(everything(), ~
      as.integer(factor(., levels = paste0("A", 1:5)))))
Sample
# A tibble: 6 x 4
#  ESIR_SQ001 ESIR_SQ002 ESIR_SQ003 ESIR_SQ004
#       <int>      <int>      <int>      <int>
#1         NA         NA         NA         NA
#2          4          2          2          1
#3          4          4          2          2
#4          3          3          2          3
#5          3          4          2          1
#6         NA         NA         NA         NA
  

Или использование match для значений в этом порядке

 Sample %>%
    mutate(across(everything(), ~ match(., paste0("A", 1:5))))
  

Или другой вариант — удалить букву в начале

 library(stringr)
Sample %>%
   mutate(across(everyting(), ~ as.integer(str_remove(., 'A'))))
  

Или с помощью parse_number

 Sample %>%
  mutate(across(everyting(), readr::parse_number))
  

Или, если мы хотим использовать base R , это также просто

 Sample[] <- lapply(Sample, function(x) 
      as.integer(factor(x, levels = paste0("A", 1:5))))
  

Ответ №2:

На самом деле вы могли бы сделать это очень легко с gsub .

 dat[1:4] <- lapply(dat[1:4], gsub, pattern="A", replacement="")
str(dat)
#   ESIR_SQ001 ESIR_SQ002 ESIR_SQ003 ESIR_SQ004
# 1       <NA>       <NA>       <NA>       <NA>
# 2          4          2          2          1
# 3          4          4          2          2
# 4          3          3          2          3
# 5          3          4          2          1
# 6       <NA>       <NA>       <NA>       <NA>
  

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

 gsub.num <- function(x) as.double(gsub("A", "", x))
dat[1:4] <- lapply(dat[1:4], gsub.num)
dat
# Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 6 obs. of  4 variables:
#  $ ESIR_SQ001: num  NA 4 4 3 3 NA
#  $ ESIR_SQ002: num  NA 2 4 3 4 NA
#  $ ESIR_SQ003: num  NA 2 2 2 2 NA
#  $ ESIR_SQ004: num  NA 1 2 3 1 NA