简体   繁体   中英

R: Selection for x,y coordinates with conditions

I have some difficulties to solve a problem concerning the selection of values in a data frame. Here is the thing: - I have a data frame containing these variables: x-coordinates, y-coordinates, diameter, G value, H value, Quality value, Ecological value. Each line corresponds to one individual (which are trees in this exercise)

  • I need to find the individual with the best quality value = this I can do it
  • But then, I have to find the second tree with a good quality value, which has to be in the 10 next meters of the reference tree (the one with the best quality value).
  • And this selection has to be made at every tree selected, every time 10 meters further!
  • this should bring me to a selection of xy-coordinates, which are separated by 10 meters and represent good quality value.

Now, here is what I tried:

    > 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

The problem here is that we can not clearly see the difference between the coordinates for x and the ones for y.

I tried this:

 > 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" " "     

>

Where we can see better the two levels related to the x and y coordinates.

The first question is simple: Is it possible for this function to return the values in a form like x,y or xy ? (without any 0, or « », or space) Or should I use another R function to obtain this result?

The second question is complex: How can I say to R to repeat this function from the coordinates he finds in this first attempt, and for the whole data?

It's a bit hard for me to try this out without your dataset, or a small example of it, but I think the following should work for your first question.

The first time you use the function you enter the x and y coordinate of the tree that has Quality 24 for x and y in your function

> 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"))))
 + }

That should give you a matrix with two columns corresponding to the x and y coordinates and a NA if the condition is not met.

The second question is more difficult because as your output already showed there are multiple trees that meet the criteria you've set. If you want all of these checked again you can use the output of your function in a loop. Something like this:

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]))

Note that this code only prints the result, but with some clever assignment strategy you can probably save them as well

Thank you very much for your answer. It helps me a lot! The first part of my problem is solved, the second seems to have a bug somewhere... And I don't see clearly where the function says to R to go every 10 meters further (in fact, every 50 meters, according to my data, see below)...But thank you anyway, it's a good starter, I will continue my research on this problem :) PS: I understand it is difficult without the data. Unfortunately, I cannot show them on the net. However, I can show you a part of it:

      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

Here is the result with your answer for the second problem:

> 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"

Sorry, I just rename it "Arbre"

Thanks again, C.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM