【问题标题】:ifelse categorizing in rifelse 在 r 中进行分类
【发布时间】:2018-06-19 19:39:15
【问题描述】:

我正在尝试根据 x 变量的范围创建一个新的分类变量类别。

我所做的是这样的:

data$category <- ifelse(data$x >= 780, 6,
                      ifelse(750 =< data$x <= 779, 5,
                      ifelse(714 =< data$x <= 749, 4,
                      ifelse(679 =< data$x <= 713, 3,
                      ifelse(660 =< data$x <= 678, 2,
                      ifelse(640 =< data$x <= 659, 1, NA))))))

它的返回错误:意外的'

有什么建议吗?

【问题讨论】:

  • ifelse(750 &lt;= data$x &amp; data$x &lt;= 779, 5,...(注意&lt;=,不是=&lt;),但是,正如@lebatsnok 所说,cut 更简单:data$category = cut(data$x, breaks=c(-Inf, 640,660,679,714,750,778,Inf), labels=c(NA,1:6))
  • 为了将来参考,如果您确实需要明确测试类别成员资格,您可能会发现 between 函数很有用(它在 dplyr 包中)。 between(data$x, 640, 659).

标签: r if-statement dplyr


【解决方案1】:

我建议使用cut 而不是这种方法。

[edit] eipi10 在评论中展示了如何做到这一点——但我建议进行两项更改:

 d$cat <- cut(d$x, c(640, 660, 679, 714, 750, 780, Inf)-1 , labels=FALSE)
  • breaks 应低于 x 以包含 x(或者您可以使用 include.lowest)
  • 如果您设置labels=FALSE,那么您会自动获得连续整数作为标签
  • 无需将 -Inf 作为最低分,低于最低分的任何值都将自动设置为零

如您所见,这比拥有大量嵌套的ifelse 容易得多。

一种风格上的东西:将数据框称为data 不是一个好主意——这是一个基本函数的名称(但如果你这样做,不会立即发生任何事情)。

【讨论】:

    【解决方案2】:

    R 不支持语法750 =&lt; data$x &lt;= 779。将其更改为750 &lt;= data$x &amp; data$x &lt;= 779。这适用于代码中的所有范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-16
      • 2020-03-21
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 2021-05-06
      • 2021-03-29
      • 2013-10-18
      相关资源
      最近更新 更多