【问题标题】:R: How to recode multiple variables at onceR:如何一次重新编码多个变量
【发布时间】:2018-07-18 07:59:58
【问题描述】:

我的数据集中有几个变量需要以完全相同的方式重新编码,还有几个其他变量需要以不同的方式重新编码。我尝试编写一个函数来帮助我解决这个问题,但我遇到了麻烦。

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 的语法也不正确。提供样本数据是获得有效答案的最佳方式
  • 一个问题是你的 for 循环。 unique(liberals) 的值将少于 liberals
  • 这有意义吗paste(df$liberals[i] &lt;- sapply(liberals, FUN = recode_liberalSupport))? (问题在于paste。)

标签: r dplyr recode


【解决方案1】:

我认为使用 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 中重新编码的变量放回我的原始数据帧中?
  • @Steven 好的,但这本质上不是以相同的方式重新编码我数据中的所有变量吗?如果我想重新编码像1=-1, 2=1, .default = NaN 和像1=1, 2=-1, .default = NaN 这样的一些变量怎么办?然后将它们全部放回同一个数据框
  • 使用mutate_at(var1, var3, ...etc)
  • .default 的意思是“未指定的所有其他值”吗?
【解决方案2】:

与往常一样,有很多方法可以做到这一点。我不太了解 dplyr 以使用该功能,但这似乎是您正在寻找的。​​p>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多