在R中应用的用户定义函数中的If语句
如果这是一个显而易见的问题,请原谅,我是一个初学者,渴望学习 我有一个由4列组成的数据框,其中大约有150万行包含坐标信息,其中每一行代表一个特定的位置。我想做的是将这些数据运行到一个函数中,该函数包含一系列if-else语句,这些语句确定较大框中特定位置的区域。例如,一个点可以位于中心、沿长方体边缘1.5英寸以内、长方体内部但不在边缘或中心或长方体外部 每个if语句确定一组点是否在指定区域内,如果在指定区域内,则结果是if语句将“1”放在另一个数据帧的相应行中 下面是我正在尝试做的一个可视化: 从名为“维度”的数据框中获取此位置数据:在R中应用的用户定义函数中的If语句,r,if-statement,apply,R,If Statement,Apply,如果这是一个显而易见的问题,请原谅,我是一个初学者,渴望学习 我有一个由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。我已经添加了一些关于我的代码和数据的更多信息。我希望这能澄清一些问题。如果您需要更多信息,请告诉我!