0

如果这是一个明显的问题,请原谅我,我是一个渴望学习的初学者 R 用户。

我有一个 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

当程序发现哪个条件为真时,它会将 1 放在另一个名为“call”的数据框中的相应列中(这些列是列 50-53)。如果代码发现该点位于中心,这就是该行的样子:

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)
  } 
4

2 回答 2

1

如果我理解正确,以下将返回一个由 1 和 0 组成的数字向量,您可以将其插入calls.

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)

通过使用单个 & 符号,R 为 data.frame 的每一行计算条件表达式,而不是在第一次不满足条件时停止。

as.numeric为了清楚起见,我已经删除as.character了(不知道为什么这些都是必要的……这些数据是作为因素读入的吗?如果是这样,也许试试stringsAsFactors = FALSE)。

于 2013-05-09T23:04:41.713 回答
0

我将按如下方式进行(我稍微更改了您的示例):

首先预分配一个空call数据帧。

call=data.frame(matrix(NA,nrow=nrow(dimensions),ncol=4))
colnames(call)=paste("Q",1:4,sep="")

用于with能够通过 和 访问dimensionspxpy。因此,代码更易于阅读。

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);})

请注意,<<-而不是<-. 必须使用此特殊运算符,因为call它不在{call$Q1<<-ifelse ...}评估的环境中。使用<<-,也会搜索父环境。

顺便说一句:如果性能是一个问题,请查看data.table包装。

于 2013-05-10T01:03:40.517 回答