将数字与多个比较运算符和值进行比较

时间:2017-12-15 17:58:17

标签: r string dataframe data.table subset

我必须查看值列表是否属于值范围,然后分配特定值。我想找到一种方法来做到这一点,而不必使用嵌套的ifelse()语句(刚学会ifelse不能嵌套超过51次,看起来太可怕了。)。

由于这是一个人为的例子,我想知道是否有一种通用的方法(例如循环?*适用)?我正在考虑与paste(eval())有关但无法使其发挥作用。提前谢谢。

set.seed(2222)
comparison_table = data.frame(
  lower_comp = c('>=', '>=', '>='),
  upper_comp = c('<', '<', '<'),
  lower_value = c(3, 33, 100),
  upper_value = c(31, 40, 120),
  new_value = c(1, 2, 3)
)

df = data.frame(
  value = runif(n = 25, min = 1, max = 130)
)

df$new_value = with(df, 
  ifelse(value >= 3 & value < 33, 1,
  ifelse(value >= 33 & value < 100, 2, 
  ifelse(value >= 100 & value < 120, 3, NA))))

value            new_value
48.427905        NA
24.461992        1
107.576807       3
76.461703        NA
124.694209       NA
14.132063        1
98.638509        NA
32.436195        NA
88.470441        NA
9.095131         1
49.548878        NA
85.647608        NA
75.357280        NA
120.696858       NA
113.347924       3
51.364939        NA
126.896975       NA
128.282762       NA
115.333414       3
75.022578        NA
128.170932       NA
2.200451         NA
24.085131        1
99.672971        NA
24.945700        1

1 个答案:

答案 0 :(得分:3)

您可以使用cut()分割您的数值向量:

df$new_value <- cut(df$value, breaks= c(3,33,100,120),labels=FALSE, right = FALSE)

这定义了三个间隔(外部任何东西都默认为NA):

[3,33)
[33,100)
[100,120)

使用right = FALSE使左侧包含:默认为(x, y],我们需要[x, y)