R 将数字与多个比较运算符和值进行比较
我必须查看值列表是否在值的范围内,然后指定特定的值。我想找到一种不必使用嵌套的R 将数字与多个比较运算符和值进行比较,r,string,dataframe,data.table,subset,R,String,Dataframe,Data.table,Subset,我必须查看值列表是否在值的范围内,然后指定特定的值。我想找到一种不必使用嵌套的ifelse()语句就能做到这一点的方法(刚刚学习的ifelse嵌套次数不能超过51次,看起来非常糟糕) 由于这是一个人为的例子,我想知道是否有一种通用的方法来实现这一点(例如,循环?*应用)?我正在考虑如何使用粘贴(eval()),但无法使其正常工作。提前谢谢 set.seed(2222) comparison_table = data.frame( lower_comp = c('>=', '>='
ifelse()
语句就能做到这一点的方法(刚刚学习的ifelse
嵌套次数不能超过51次,看起来非常糟糕)
由于这是一个人为的例子,我想知道是否有一种通用的方法来实现这一点(例如,循环?*应用)?我正在考虑如何使用粘贴(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
set.seed(2222)
比较表=data.frame(
较低的薪酬=c('>=','>=','>='),
upper_comp=c('您可以使用cut()
将值向量拆分为:
df$new_value <- cut(df$value, breaks= c(3,33,100,120),labels=FALSE, right = FALSE)
使用right=FALSE
将左侧包含在内:默认值为(x,y)
,我们希望[x,y)
如果下组和上组列始终采用相同的值,则存在库(data.table);setDT(df);df[比较表,on=(值>=下组值,值<上组值),新值:=i.新值]
谢谢你的帮助。这对我提出的案例绝对有效。我搞砸了,没有意识到间隔“有序”我更新了这个问题。我一直在尝试想出一个解决方案,让我粘贴一个带有我需要的条件的字符串,并用数据对其进行评估。frame:df$new_值[parse](eval(text=paste0('value>=3'))]=1
到代码压缩的这一部分…@在这种情况下,我将围绕cut()
编写一个小包装函数,用grepl(“>=”,比较表$lower\comp)检查您的输入不平等性)
,如果TRUE
那么right@bringtheheat实际上,我不会像你那样格式化比较表。我只会有两列,一列用于分隔符,另一列用于定义它是左间隔还是右间隔。谢谢!是的,我对它的清晰度不是很好。我遇到的问题是条件al语句是结构化的(即2个数字)但是操作符可能不同,并且不是连续的。我包括了操作符,因为我的第一个想法是如何将条件语句粘贴在一起并进行计算……我必须用更好的细节重新编写问题。感谢cut
方法,这是一种非常有用的比较方法。我对usi有模糊的记忆在某个时候用ggplot来描述它,然后忘记了它。
[3,33)
[33,100)
[100,120)