Às 22:54 de 11/06/2023, javad bayat escreveu:
Dear Rui;
Many thanks for your email. I used one of your codes,
"data2$LU[which(data2$Layer == "Level 12")] <- "Park"", and it works
correctly for me.
Actually I need to expand the codes so as to consider all "Levels" in the
"Layer" column. There are more than hundred levels in the Layer column.
If I use your provided code, I have to write it hundred of time as below:
data2$LU[which(data2$Layer == "Level 1")] <- "Park";
data2$LU[which(data2$Layer == "Level 2")] <- "Agri";
...
...
...
.
Is there any other way to expand the code in order to consider all of the
levels simultaneously? Like the below code:
data2$LU[which(data2$Layer == c("Level 1","Level 2", "Level 3", ...))] <-
c("Park", "Agri", "GS", ...)


Sincerely




On Sun, Jun 11, 2023 at 1:43 PM Rui Barradas <ruipbarra...@sapo.pt> wrote:

Às 21:05 de 11/06/2023, javad bayat escreveu:
Dear R users;
I am trying to fill a column based on a specific value in another column
of
a dataframe, but it seems there is a problem with the codes!
The "Layer" and the "LU" are two different columns of the dataframe.
How can I fix this?
Sincerely


for (i in 1:nrow(data2$Layer)){
            if (data2$Layer == "Level 12") {
                data2$LU == "Park"
                }
            }




Hello,

There are two bugs in your code,

1) the index i is not used in the loop
2) the assignment operator is `<-`, not `==`


Here is the loop corrected.

for (i in 1:nrow(data2$Layer)){
    if (data2$Layer[i] == "Level 12") {
      data2$LU[i] <- "Park"
    }
}



But R is a vectorized language, the following two ways are the idiomac
ways of doing what you want to do.



i <- data2$Layer == "Level 12"
data2$LU[i] <- "Park"

# equivalent one-liner
data2$LU[data2$Layer == "Level 12"] <- "Park"



If there are NA's in data2$Layer it's probably safer to use ?which() in
the logical index, to have a numeric one.



i <- which(data2$Layer == "Level 12")
data2$LU[i] <- "Park"

# equivalent one-liner
data2$LU[which(data2$Layer == "Level 12")] <- "Park"


Hope this helps,

Rui Barradas



Hello,

You don't need to repeat the same instruction 100+ times, there is a way of assigning all new LU values at the same time with match().
This assumes that you have the new values in a vector.


Values <- sort(unique(data2$Layer))
Names <- c("Park", "Agri", "GS")

i <- match(data2$Layer, Values)
data2$LU <- Names[i]


Hope this helps,

Rui Barradas

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to