有没有更优雅的方法在 R 中使用映射值?

Is there a more elegant way to use mapvalues in R?

我想找到一种更优雅的方式将我的数据从李克特量表转换为标准化量表。 Plyr 的 mapvalues 似乎有效,但并不优雅。我尝试了 purrr,但它没有像我希望的那样工作。

   data$var1 <- mapvalues(data$var1, 
      from=c("1","2","3", "4", "5"), 
      to=as.integer(c("0", "25", "50", "75", "100"))

我有几个变量想要转换,因此任何关于使用 purrr 函数执行此操作的见解都会很棒。

这是我的第一个 Whosebug post 如果我没有遵循正确的协议,请原谅我。

-RP

如果您正在寻找更简洁的解决方案,您可以使用 dplyr 的 mutate 而不是 purrr 函数重新编码您的变量:

sampledata %>%
  mutate(var1 = seq(from=0, to=100, by=25)[var1])

要跨多个列应用此方法,请在 mutate 中使用 across,选择您要转换的列,例如:

sampledata %>%
  mutate(across(.cols = everything(), ~ seq(from=0, to=100, by=25)[.]))

由于这里有一个明确的替换模式,我们可以从 var1 中减去 1 并乘以 25。我没有替换 var1,而是创建了一个新列 var2 以便更容易理解。

library(dplyr)

data <- data %>% mutate(var2 = 25 * (var1 - 1))
data

#   var1 var2
#1     3   50
#2     3   50
#3     2   25
#4     2   25
#5     3   50
#6     5  100
#7     4   75
#8     1    0
#9     2   25
#10    3   50

如果没有这样明确的模式,并且由于 plyr 已经停用,您可以使用 dplyr::recode

data <- data %>% 
        mutate(var2 = recode(var1, `1`=0, `2`=25, `3`=50, `4`=75, `5`=100))

数据

如果您在 reproducible format -

中提供数据,会更容易提供帮助
set.seed(123)
data <- data.frame(var1 = sample(5, 10, replace = TRUE))