如何同时重新编码多个变量

7
我在数据集中有几个变量需要进行完全相同的重新编码,还有几个变量需要以不同的方式重新编码。我尝试编写一个函数来帮助我完成这个任务,但是遇到了麻烦。
library(dplyr)
recode_liberalSupport = function(arg1){
  arg1 = recode(arg1, "1=-1;2=1;else=NA")
  return(arg1)
}

liberals = c(df$var1, df$var4, df$var8)
for(i in unique(liberals)){
  paste(df$liberals[i] <- sapply(liberals, FUN = recode_liberalSupport))
}

R Studio 运行了大约 5 分钟,然后给我显示了这个错误信息:

Error in `$<-.data.frame`(`*tmp*`, liberals, value = c(NA_real_, NA_real_,  : 
  replacement has 9 rows, data has 64600
In addition: Warning messages:
1: Unknown or uninitialised column: 'liberals'. 
2: In df$liberals[i] <- sapply(liberals, FUN = recode_liberalSupport) :
  number of items to replace is not a multiple of replacement length

任何帮助都将不胜感激!谢谢。

你可能想在这里使用mutate_at而不是apply。我认为你的recode语法也不正确。提供样本数据是获得有效答案的最佳方式。 - Calum You
一个问题是你的for循环。 unique(liberals)的值将比liberals少。 - Punintended
这段代码有意义吗 paste(df$liberals[i] <- sapply(liberals, FUN = recode_liberalSupport))?(问题出在 paste 上。) - Rui Barradas
2个回答

19

我认为使用dplyr更整洁。正确使用recode是一个好主意。mutate_all()可用于操作整个数据框,mutate_at()仅用于选择的变量。在dplyr中有许多指定变量的方法。

mydata <- data.frame(arg1=c(1,2,4,5),arg2=c(1,1,2,0),arg3=c(1,1,1,1))

mydata

  arg1 arg2 arg3
1    1    1    1
2    2    1    1
3    4    2    1
4    5    0    1

mydata <- mydata %>% 
     mutate_at(c("arg1","arg2"), funs(recode(., `1`=-1, `2`=1, .default = NaN)))

mydata

  arg1 arg2 arg3
1   -1   -1    1
2    1   -1    1
3  NaN    1    1
4  NaN  NaN    1

我使用NaN而不是NA,因为它是数值,在其他数字列中更容易管理。


我知道这个是怎么工作的,但是我该怎么把 mydata 中处理过的变量放回到原始数据框中呢? - Bertrand
@Steven 好的,但这不是将我的数据中所有变量都以相同的方式重新编码吗?如果我想要像 1=-1, 2=1, .default = NaN 这样重新编码一些变量,而另一些变量则像 1=1, 2=-1, .default = NaN 这样重新编码怎么办?然后再把它们放回到同一个数据框中。 - Bertrand
使用 mutate_at(var1, var3, ...等) - Stephen Henderson
.default 是指“未指定的所有其他值”吗? - coip

0

通常有很多种方法可以实现这个功能。我不太熟悉dplyr函数,但这似乎是您要寻找的内容。

mydata <- data.frame(arg1=c(1,2,4,5),arg2=c(1,1,2,0))
mydata
  arg1 arg2
1    1    1
2    2    1
3    4    2
4    5    0

使用嵌套的ifelse()函数进行重新编码的功能

recode_liberalSupport <- function(var = "arg1", data=mydata) {
+   recoded <- ifelse(mydata[[var]] == 1, -1,
+                           ifelse(mydata[[var]] == 2, 1, NA))
+   return(recoded)
+ }

调用函数

recode_liberalSupport(var = "arg1")
[1] -1  1 NA NA

将变量arg1替换为重新编码的值。

mydata$arg1 <- recode_liberalSupport(var = "arg1") 
mydata
  arg1 arg2
1   -1    1
2    1    1
3   NA    2
4   NA    0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接