在for循环中重新编码几个变量

我正在处理一些调查数据,其中一些响应的编码不一致。例如,“我不知道”可能被编码为 4、5、97 或 777。我想尽可能有效地将所有这些响应标准化为“77”。我想使用人行横道,并希望避免为发生这种情况的每个变量创建一个新的重新编码命令,如果可能的话,因为有几个。

library(tidyverse)

#df with the inconsistent fourth category
var1 <- c("1", "2", "3", "4")
var2 <- c("1", "2", "3", "5")
var3 <- c("1", "2", "3", "97")
var4 <- c("1", "2", "3", "777")

df <- data.frame(var1, var2, var3, var4)

var <- c("var1", "var2", "var3", "var4")
oldvalue <- c("4", "6", "97", "777")
newvalue <- c("77", "77", "77", "77")

#crosswalk of old values to new values
cw <- data.frame(var, oldvalue, newvalue)

recodevars = cw$var

我尝试过的一些事情如下,尽管我没有任何运气。如果您有任何建议,请告诉我。

rec_all = df %>%
  transmute_at(vars(recodevars), funs(recode(., cw$oldvalue = cw$newvalue)))


for(i in recodevars){
  rec_all = df %>%
    transmute_at(vars(recodevars), funs(ifelse(i == cw$oldval, cw$newval, i)))
}

回答

循环across'recodevars' 列,根据列名 ( cur_column())对 'cw' 数据集行进行子集化,同时删除第一列,使用它来匹配和替换数据的值,并coalesce使用原始列,以便NA非-matches 替换为相应的原始列值

library(dplyr)
library(tibble)
df %>% 
    mutate(across(all_of(recodevars), 
       ~ coalesce(deframe(cw[cw$var ==cur_column(),][-1])[as.character(.)], .)))

-输出

  var1 var2 var3 var4
1    1    1    1    1
2    2    2    2    2
3    3    3    3    3
4   77    5   77   77


以上是在for循环中重新编码几个变量的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>