用于重新编码值或类似值的 R 函数(如 SPSS)

EGM*_*686 2 r recode tidyverse

我有一个具有以下结构的数据框:

id v1 v2 v3 v4 v5
1  .  1  .  2  3
2  1  2  3  .  .
3  3  2  .  1  .
Run Code Online (Sandbox Code Playgroud)

我想像这样重新编码

id v1 v2 v3 v4 v5
1  0  3  0  2  1
2  3  2  1  0  0
3  1  2  0  3  0
Run Code Online (Sandbox Code Playgroud)

所以我想重新编码值 (1=3) (missing = 0) (3=1)

在 SPSS 中,这是相当直观的:

recode v1 to v5 (sysmis=0)(3=1)(1=3)(else=copy). 
Run Code Online (Sandbox Code Playgroud)

我正在 R 中寻找类似的方法。对基本方法或 tidyverse 方法没有偏好。

akr*_*run 5

替换.to NA,将列 ( ) 的类型转换type.convert为数字,减去 4 并将 替换NA为 0

df[df == "."] <- NA
df <- type.convert(df, as.is = TRUE)
df[-1] <- 4- df[-1]
df[is.na(df)] <- 0
Run Code Online (Sandbox Code Playgroud)

或者使用tidyverse

library(dplyr)
library(tidyr)
df %>% 
  mutate(across(-id, ~ replace_na(4 - as.numeric(.x), 0)))
Run Code Online (Sandbox Code Playgroud)

-输出

  id v1 v2 v3 v4 v5
1  1  0  3  0  2  1
2  2  3  2  1  0  0
3  3  1  2  0  3  0
Run Code Online (Sandbox Code Playgroud)

-输出

> df
  id v1 v2 v3 v4 v5
1  1  0  3  0  2  1
2  2  3  2  1  0  0
3  3  1  2  0  3  0
Run Code Online (Sandbox Code Playgroud)

数据

df <- structure(list(id = 1:3, v1 = c(".", "1", "3"), v2 = c(1L, 2L, 

2L), v3 = c(".", "3", "."), v4 = c("2", ".", "1"), v5 = c("3", 
".", ".")), class = "data.frame", row.names = c(NA, -3L))
Run Code Online (Sandbox Code Playgroud)