#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