在R中应用的用户定义函数中的If语句

在R中应用的用户定义函数中的If语句,r,if-statement,apply,R,If Statement,Apply,如果这是一个显而易见的问题,请原谅,我是一个初学者,渴望学习 我有一个由4列组成的数据框,其中大约有150万行包含坐标信息,其中每一行代表一个特定的位置。我想做的是将这些数据运行到一个函数中,该函数包含一系列if-else语句,这些语句确定较大框中特定位置的区域。例如,一个点可以位于中心、沿长方体边缘1.5英寸以内、长方体内部但不在边缘或中心或长方体外部 每个if语句确定一组点是否在指定区域内,如果在指定区域内,则结果是if语句将“1”放在另一个数据帧的相应行中 下面是我正在尝试做的一个可视化:

如果这是一个显而易见的问题,请原谅,我是一个初学者,渴望学习

我有一个由4列组成的数据框,其中大约有150万行包含坐标信息,其中每一行代表一个特定的位置。我想做的是将这些数据运行到一个函数中,该函数包含一系列if-else语句,这些语句确定较大框中特定位置的区域。例如,一个点可以位于中心、沿长方体边缘1.5英寸以内、长方体内部但不在边缘或中心或长方体外部

每个if语句确定一组点是否在指定区域内,如果在指定区域内,则结果是if语句将“1”放在另一个数据帧的相应行中

下面是我正在尝试做的一个可视化:

从名为“维度”的数据框中获取此位置数据:

 sz_top | sz_bot |     px |   pz  |   
  3.526 |   1.615|  -1.165| 3.748 |
通过这些语句运行它(实际语句要长得多),其中“else”条件表示该点完全在框外:

if(in center) else if(on edge) else if(in box, but not in center or on edge) else
当程序发现哪个条件为真时,它会在另一个名为“call”的数据框中相应列(这些列是第50-53列)中放入1。这是代码发现点位于中心时该行的外观:

center| edge| other_in| out| 
  1   |  0  |       0 |   0|
需要注意的一点是,可以提高效率的是,坐标实际上也包含在第22、23、26和27列中的“调用”数据框中,但我将它们移动到了“维度”,因为这样对我来说更容易处理。这是绝对可以改变的

我现在很不清楚如何从这里开始。我已经编写了所有if-else语句,但我不清楚我的程序如何知道它位于哪一行,以便用测试结果正确标记相应的行

如果你想从我这里得到更多信息,请告诉我

谢谢

编辑:

以下是“维度”数据框的示例:

sz_top  sz_bot  px  pz
1   3.526   1.615   -1.165  3.748
2   3.29    1.647   -0.412  1.9
3   3.29    1.647   -1.213  1.352
4   3.565   1.75    -1.041  2.419
5   3.565   1.75    -0.357  1.776
6   3.565   1.75    0.838   0.834
7   3.541   1.724   -1.619  3.661
8   3.541   1.724   -2.498  2.421
9   3.541   1.724   -1.673  2.348
10  3.541   1.724   -1.572  2.982
11  3.305   1.5 -1.316  2.842
下面是我的一个if语句的示例。其他的都很相似,只是看看盒子周围的不同位置:

  if(
    ((as.numeric(as.character(dimensions$px))*12)>= -3)
    &&
      ((as.numeric(as.character(dimensions$px))*12)<= 3)
    &&
      ((as.numeric(as.character(dimensions$pz))*12)<=((as.numeric(as.character(dimensions$sz_top))*12-as.numeric(as.character(dimensions$sz_bot))*12)/2)+(as.numeric(as.character(dimensions$sz_bot))*12)+3)
    &&
      ((as.numeric(as.character(dimensions$pz))*12)>=((as.numeric(as.character(dimensions$sz_top))*12-as.numeric(as.character(dimensions$sz_bot))*12)/2)+(as.numeric(as.character(dimensions$sz_bot))*12)-3)
  ){return(1)
  } 
if(
((作为数字(作为字符(维度$px))*12>=-3)
&&

((as.numeric(as.character(dimensions$px))*12)如果我理解正确,下面将返回一个1和0的数字向量,您可以将其插入
调用的相应列中

dimensions <- read.table(text='sz_top  sz_bot  px  pz
1   3.526   1.615   -1.165  3.748
2   3.29    1.647   -0.412  1.9
3   3.29    1.647   -1.213  1.352
4   3.565   1.75    -1.041  2.419
5   3.565   1.75    -0.357  1.776
6   3.565   1.75    0.838   0.834
7   3.541   1.724   -1.619  3.661
8   3.541   1.724   -2.498  2.421
9   3.541   1.724   -1.673  2.348
10  3.541   1.724   -1.572  2.982
11  3.305   1.5 -1.316  2.842', header=T, row.names=1)


as.numeric(
  dimensions$px*12 >= -3
  & dimensions$px*12 <= 3
  & dimensions$pz*12 <= 
    (dimensions$sz_top*12 - dimensions$sz_bot*12)/2 + (dimensions$sz_bot*12) + 3
  & dimensions$pz*12 >= 
    (dimensions$sz_top*12 - dimensions$sz_bot*12)/2 + (dimensions$sz_bot*12) - 3)
dimensions=-3

&维度$px*12我将按照以下步骤进行操作(我稍微更改了您的示例):

首先预先分配一个空的
调用
数据帧

call=data.frame(matrix(NA,nrow=nrow(dimensions),ncol=4))
colnames(call)=paste("Q",1:4,sep="")
使用
可以通过
px
py
访问
维度中的列名。因此,代码更易于阅读

with(dimensions,{
call$Q1<<-ifelse(px>0&pz>0,1,0);
call$Q2<<-ifelse(px<0&pz>0,1,0);
call$Q3<<-ifelse(px<0&pz<0,1,0);
call$Q4<<-ifelse(px>0&pz<0,1,0);})
带有(尺寸{
致电$Q10,1,0);

打电话给$Q2Hi Alex,欢迎来到SO。您的问题不是很清楚。请发布实际数据样本(
dput(头部(尺寸))
)以及您用于
ifelse
语句的代码。这将有助于生成响应。谢谢,Simon。我已经添加了一些关于我的代码和数据的更多信息。我希望这能澄清一些问题。如果您需要更多信息,请告诉我!