使用“ ifelse”语句重新编码一列中的多个值

时间:2019-02-14 23:28:58

标签: r if-statement

对于使用“ R”(用于SPSS),我是新手,对于给定变量的多个响应或情况,我在重新编码该变量的值时遇到麻烦。我正在尝试使用“ ifelse”函数来实现此目的,但是我无法使该函数用于修改两个以上变量值。我想重新编码具有多种情况的变量的响应。当前数据中包含#的1、2、3、4,我想像这样重新编码这些数字:

  • (1 = 0.6)
  • (2 = 1.2)
  • (3 = 2.5)
  • (4 = 1.8)

我正在尝试使用“ ifelse”函数来实现此目的,但是我无法使该函数为特定变量修改两个以上的不同值。

ChildPABase19_test$Predilection_1 <- ifelse(ChildPABase19_test$Predilection_1==1, 0.6, ifelse(ChildPABase19_test$Predilection_1==2, 1.2,
ifelse(ChildPABase19_test$Predilection_1==3, 2.5, ifelse(ChildPABase19_test$Predilection_1==4, 1.8))

我希望变量Predilection_1的列中的所有数据都用0.6、1.2、2.5、1.8重新编码,但是我一直收到错误消息:参数“ no”丢失了,没有默认值。我将如何修改此代码的任何想法将不胜感激!

3 个答案:

答案 0 :(得分:1)

如果您add more white space浏览代码,则可能更容易发现问题。

ChildPABase19_test$Predilection_1 <- ifelse(
  ChildPABase19_test$Predilection_1 == 1, 
  0.6, 
  ifelse(
    ChildPABase19_test$Predilection_1 == 2, 
    1.2, 
    ifelse(
      ChildPABase19_test$Predilection_1 == 3, 
      2.5, 
      ifelse(
        ChildPABase19_test$Predilection_1 == 4, 
        1.8
      )
    )

由此您可能会看到两件事:最后一个ifelse()仅具有两个参数,而不是三个,并且缺少两个右括号。第一件事是导致错误消息的原因:缺少的第三个参数是R抱怨的'no'参数丢失。如果原始值不是1、2、3或4之一,则应将此参数设置为希望Predilection_1的值。如果您没有考虑任何值,则应该设置到NA

您还应该添加两个缺少的右括号,否则代码将无法运行。

难以读取嵌套的ifelse()函数是dplyr程序包包含case_when()函数的原因之一。您可以使用它生成更短的代码:

ChildPABase19_test <- mutate(ChildPABase19_test, Predilection_1 = case_when(
  Predilection_1 == 1 ~ 0.6,
  Predilection_1 == 2 ~ 1.2,
  Predilection_1 == 3 ~ 2.5,
  Predilection_1 == 4 ~ 1.8,
  TRUE ~ NA_real_
))

如果需要进一步的帮助,documentation for case_when()中的示例在解释语法方面做得很好。

答案 1 :(得分:1)

我认为使用dplyr软件包的这段代码可能会有所帮助:

require(dplyr)
x = c(1, 2, 3, 4)
transform_rule <- list(
    "1" = "0.6",
    "2" = "1.2",
    "3" = "2.5",
    "4" = "1.8"
)
x_recoded <- as.numeric(recode(x, !!!transform_rule))

答案 2 :(得分:1)

library(expss)
ChildPABase19_test = data.frame(Predilection_1 = c(1, 2, 3, 4))
recode(ChildPABase19_test$Predilection_1) = c(1 ~ 0.6, 2 ~ 1.2, 3 ~ 2.5, 4 ~ 1.8)

ChildPABase19_test
#    Predilection_1
# 1            0.6
# 2            1.2
# 3            2.5
# 4            1.8