Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数字与多个比较运算符和值进行比较_R_String_Dataframe_Data.table_Subset - Fatal编程技术网

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)