R:选择具有条件的x,y坐标

时间:2017-06-22 11:37:10

标签: r loops select coordinates

我在解决有关数据框中值的选择问题时遇到了一些困难。这是事情: - 我有一个包含这些变量的数据框:x坐标,y坐标,直径,G值,H值,质量值,生态值。每行对应一个人(本练习中的树木)

  • 我需要找到质量最好的人=我能做到这一点
  • 但是,我必须找到质量值很高的第二棵树,它必须位于参考树的10米(质量值最高的那一块)的下一页。
  • 这个选择必须在每一棵树上进行,每次进一步10米!
  • 这应该让我选择x-y坐标,这些坐标相隔10米,代表着良好的品质价值。

现在,这是我尝试过的:

    > kk<- function(x, y) 
+ { 
+   coordx<-data$x.Koordinate[data$Q==24] #I have looked before for the best quality value of the sample, which is 24
+   coordy<-data$y.Koordinate[data$Q==24]
+   x <- ifelse(data$x.Koordinate>coordx-11 & data$Q>15,data$x.Koordinate,0) #I choose that I did'nt wanted to have less than 15 of quality value
+   y<-ifelse(data$y.Koordinate>coordy-11 & data$Q>15,data$y.Koordinate,0)#-11 meters from the reference coordinates, the next tree selected has to be inbetween
+   return(c(x,y))
+ }
> kk(data$x.Koordinate, data$y.Koordinate)
 [1]      0      0      0      0      0 205550 205550      0 205600 205600      0      0      0      0      0      0      0
[18] 604100      0 604150 604100      0

这里的问题是我们无法清楚地看到x的坐标和y的坐标之间的差异。

我试过了:

 > kk<- function(x, y) 
+ { 
+   coordx<-data$x.Koordinate[data$Q==24]
+   coordy<-data$y.Koordinate[data$Q==24]
+   x <- ifelse(data$x.Koordinate>coordx-11 & data$Q>15,data$x.Koordinate," ")
+   y<-ifelse(data$y.Koordinate>coordy-11 & data$Q>15,data$y.Koordinate," ")
+   return(list(x,y))
+ }
> kk(data$x.Koordinate, data$y.Koordinate)
[[1]]
 [1] " "      " "      " "      " "      " "      "205550" "205550" " "      "205600" "205600" " "     

[[2]]
 [1] " "      " "      " "      " "      " "      " "      "604100" " "      "604150" "604100" " "     

>

我们可以更好地看到与x和y坐标相关的两个级别。

第一个问题很简单:此函数是否可以以x,y或x y等形式返回值? (没有任何0,或«»,或空格)或者我应该使用另一个R函数来获得此结果?

第二个问题很复杂:如何从R在第一次尝试中找到的坐标以及整个数据中重复此函数?

2 个答案:

答案 0 :(得分:0)

如果没有您的数据集或其中的一个小例子,我会有点难以尝试这一点,但我认为以下内容适用于您的第一个问题。

第一次使用该功能时,在函数中输入x和y的质量为24的树的x和y坐标

> kk<- function(x, y) 
+ {
+   coordx<-x
+   coordy<-y
+   x1 <- ifelse(data$x.Koordinate>coordx-11 &  data$Q>15,data$x.Koordinate,NA) 
+   y1 <- ifelse(data$y.Koordinate>coordy-11 & data$Q>15,data$y.Koordinate,NA)
 +   return(matrix(c(x1,y1),nrow=length(x1), ncol=2, dimnames=list(NULL, c("x","y"))))
 + }

那应该给你一个矩阵,其中有两列对应于x和y坐标,如果条件不满足则为NA。

第二个问题更难,因为您的输出已经显示有多个树符合您设置的标准。如果你想再次检查所有这些,你可以在循环中使用函数的输出。像这样:

Tree1_friends<-kk(data$x.Koordinate[data$Q==24], data$y.Koordinate[data$Q==24])
    for (i in 1:length(Tree1_friends[,1]))
 print(kk(Tree1_friends[i,1],Tree1_friends[i,2]))

请注意,此代码仅打印结果,但是通过一些聪明的分配策略,您可以保存它们

答案 1 :(得分:0)

非常感谢您的回答。它帮助了我很多!我的问题的第一部分已经解决了,第二部分似乎在某个地方出现了一个错误......而且我没有清楚地看到函数对R所说的每10米走得更远(事实上,每隔50米,根据我的数据,见下文)...但是,无论如何,谢谢你,它是一个很好的首发,我会继续研究这个问题:) PS:我理解没有数据很难。不幸的是,我无法在网上展示它们。但是,我可以告诉你一部分:

      ID Bezeichnung x.Koordinate y.Koordinate  Q    N hdom   V Mittelstamm Fi Ta Foe Lae ueN  Bu Es Ei Ah ueL Struktur
1  10,809          62       205450       603950  8 1067   21  64          10 NA NA  NA  NA  NA 100 NA NA NA  NA       NA
2  10,810          63       205450       604000 16 1333   22 128          12 NA NA  NA  NA  NA  75 NA NA 25  NA       NA
3  10,811          56       205500       604050 20  800   22 160          18 NA NA  NA  NA  NA  60 NA NA NA  40       NA
4  10,812          55       205500       604000 12 1033   20  97          12 33 NA  NA  NA  NA  67 NA NA NA  NA       NA
5  10,813          54       205500       603950 20  500   56   0          23 NA NA  NA  NA  NA 100 NA NA NA  NA       NA
6  10,814          46       205550       604050 16  567   32 215          19 75 NA  NA  NA  NA  25 NA NA NA  NA       NA
7  10,815          47       205550       604100 16  233   26 174          30 NA 25  NA  NA  NA  50 NA NA NA  25       NA
8  10,816          48       205550       604150  0 1167   16   0           0 NA NA  NA  NA  NA  NA NA NA NA  NA       NA
9  10,817          43       205600       604150 24  633   33 366          22 83 17  NA  NA  NA  NA NA NA NA  NA       NA
10 10,818          42       205600       604100 16 1500   33 282          12 NA NA  NA  NA  NA  NA NA NA 75  25       NA

以下是您对第二个问题的回答结果:

> Arbres<-kk(x.Koordinate, y.Koordinate, data=data)
> for (i in 1:length(Arbres[,1])
+   kk(Arbres(i,1),Arbres[i,2])
Error: unexpected symbol in:
"for (i in 1:length(Arbres[,1])
  kk"

抱歉,我只是将其重命名为#34; Arbre&#34;

再次感谢, 下进行。