【问题标题】:compare number to multiple comparison operators and values将数字与多个比较运算符和值进行比较
【发布时间】:2018-05-29 23:20:56
【问题描述】:

我必须查看值列表是否在值范围内,然后分配特定值。我想找到一种方法来做到这一点,而不必使用嵌套的 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

【问题讨论】:

  • 如果您的 lower_comp 和 upper_comp 列始终采用相同的值,则有 library(data.table); setDT(df); df[comparison_table, on=.(value &gt;= lower_value, value &lt; upper_value), new_value := i.new_value ]

标签: r string dataframe data.table subset


【解决方案1】:

您可以使用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)

【讨论】:

  • 感谢您的帮助。这绝对适用于我提出的情况。我搞砸了,没有意识到间隔“有序”我更新了问题。我一直在尝试提出一个解决方案,让我可以paste 一个具有我需要的条件的字符串,并使用data.frame:df$new_value[parse(eval(text = paste0('value &gt;= 3'))] = 1 对这部分代码进行评估.....
  • @bringtheheat 在这种情况下,我会在cut() 周围写一个小包装函数,用grepl("&gt;=", comparison_table$lower_comp) 检查你的输入不等式,然后说如果TRUE 然后right &lt;- FALSE,否则right &lt;- TRUE。然后将您的休息时间列表unique(c(comparison_table$lower_value,comparison_table$upper_value)) 传递给breaks。这当然只有在你的不平等是一致的情况下才有效,即你遵循 ">= 和 和
  • @bringtheheat 实际上,我不会像您那样格式化比较表。我只有两列,一列用于休息,一列用于定义是左手间隔还是右手间隔。
  • 谢谢!是的,我的清晰度并不是那么好。我遇到的问题是条件语句是结构化的(即 2 个数字),但运算符可能不同且不连续。我包括了运算符,因为我的第一个想法是如何将条件语句粘贴在一起并进行评估……我将不得不用更好的细节重新编写问题。感谢cut 方法,这是一种非常有用的比较方法。我有一个模糊的记忆,在某些时候将它与 ggplot 一起使用并忘记了它。
猜你喜欢
  • 2012-05-29
  • 2021-11-28
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多