Às 23:13 de 12/06/2023, javad bayat escreveu:
Dear Rui; Many thanks for the email. I tried your codes and found that the length of the "Values" and "Names" vectors must be equal, otherwise the results will not be useful. For some of the characters in the Layer column that I do not need to be filled in the LU column, I used "NA". But I need to delete some of the rows from the table as they are useless for me. I tried this code to delete entire rows of the dataframe which contained these three value in the Layer column: It gave me the following error.data3 = data2[-grep(c("_esmdes","_Des Section","0"), data2$Layer),]Warning message: In grep(c("_esmdes", "_Des Section", "0"), data2$Layer) : argument 'pattern' has length > 1 and only the first element will be useddata3 = data2[!grepl(c("_esmdes","_Des Section","0"), data2$Layer),]Warning message: In grepl(c("_esmdes", "_Des Section", "0"), data2$Layer) : argument 'pattern' has length > 1 and only the first element will be used How can I do this? Sincerely On Sun, Jun 11, 2023 at 5:03 PM Rui Barradas <[email protected]> wrote:Às 13:18 de 11/06/2023, Rui Barradas escreveu:À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" inthe"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 asbelow: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 ofthelevels 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 <[email protected]> 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 columnofa 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 BarradasHello, 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.Sorry, this is not clear. I mean This assumes that you have the new values in a vector, the vector Names below. The vector of values to be matched is created from the data. Rui BarradasValues <- sort(unique(data2$Layer)) Names <- c("Park", "Agri", "GS") i <- match(data2$Layer, Values) data2$LU <- Names[i] Hope this helps, Rui Barradas ______________________________________________ [email protected] 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.
Hello,Please cc the r-help list, R-Help is threaded and this can in the future be helpful to others.
You can combine several patters like this:
pat <- c("_esmdes|_Des Section|0")
grep(pat, data2$Layer)
or, programatically,
pat <- paste(c("_esmdes","_Des Section","0"), collapse = "|")
Hope this helps,
Rui Barradas
______________________________________________
[email protected] 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.

