R函数替换给定列范围内的值

时间:2020-09-11 15:33:42

标签: r dataframe replace

我的李克特量表的范围是1到5,但是在调查数据库中,我错误地将答案标记为A1:A5。

item[i].category

我有多个规模并且有成千上万的参与者,所以我想知道是否存在一种方法来替换我数据框的一系列变量上的值:

ex from col 1:5(A1 = 1,A2 = 2,A3 = 3,A4 = 4,A5 = 5)

2 个答案:

答案 0 :(得分:2)

在按照自定义顺序指定的integer转换为factor后,我们可以强制使用levels。这将是一种简单的方法。
由于输入数据集是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))))

答案 1 :(得分: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