Hi Javed, grep returns the positions of the matches. See an example below.> v <- c("abc", "bcd", "def") > v[1] "abc" "bcd" "def"> grep("cd",v)[1] 2> w <- v[-grep("cd",v)] > w[1] "abc" "def">On Tue, Jun 13, 2023 at 8:50?AM javad bayat <j.bayat194 at gmail.com> wrote:> > Dear Rui; > Hi. I used your codes, but it seems it didn't work for me. > > > pat <- c("_esmdes|_Des Section|0") > > dim(data2) > [1] 281549 9 > > grep(pat, data2$Layer) > > dim(data2) > [1] 281549 9 > > What does grep function do? I expected the function to remove 3 rows of the > dataframe. > I do not know the reason. > > > > > > > On Mon, Jun 12, 2023 at 5:16?PM Rui Barradas <ruipbarradas at sapo.pt> wrote: > > > ?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 > > > used > > > > > >> data3 = 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 <ruipbarradas at sapo.pt> > > 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" 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 <ruipbarradas at 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. > > >> > > >> 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 Barradas > > >> > > >>> > > >>> > > >>> 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 at 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. > > >> > > >> > > > > > 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 > > > > > > -- > Best Regards > Javad Bayat > M.Sc. Environment Engineering > Alternative Mail: bayat194 at yahoo.com > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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.
?s 17:18 de 13/06/2023, javad bayat escreveu:> Dear Rui; > Hi. I used your codes, but it seems it didn't work for me. > >> pat <- c("_esmdes|_Des Section|0") >> dim(data2) > [1] 281549 9 >> grep(pat, data2$Layer) >> dim(data2) > [1] 281549 9 > > What does grep function do? I expected the function to remove 3 rows of the > dataframe. > I do not know the reason. > > > > > > > On Mon, Jun 12, 2023 at 5:16?PM Rui Barradas <ruipbarradas at sapo.pt> wrote: > >> ?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 >>> used >>> >>>> data3 = 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 <ruipbarradas at sapo.pt> >> 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" 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 <ruipbarradas at 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. >>>> >>>> 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 Barradas >>>> >>>>> >>>>> >>>>> 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 at 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. >>>> >>>> >>> >> 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 >> >> >Hello, I only posted a corrected grep statement, the complete code should be pat <- c("_esmdes|_Des Section|0") data3 <- data2[-grep(pat, data2$Layer),] Sorry for the confusion. Hope this helps, Rui Barradas
Dear Rui; Hi. I used your codes, but it seems it didn't work for me.> pat <- c("_esmdes|_Des Section|0") > dim(data2)[1] 281549 9> grep(pat, data2$Layer) > dim(data2)[1] 281549 9 What does grep function do? I expected the function to remove 3 rows of the dataframe. I do not know the reason. On Mon, Jun 12, 2023 at 5:16?PM Rui Barradas <ruipbarradas at sapo.pt> wrote:> ?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 > > used > > > >> data3 = 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 <ruipbarradas at sapo.pt> > 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" 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 <ruipbarradas at 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. > >> > >> 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 Barradas > >> > >>> > >>> > >>> 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 at 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. > >> > >> > > > 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 > >-- Best Regards Javad Bayat M.Sc. Environment Engineering Alternative Mail: bayat194 at yahoo.com [[alternative HTML version deleted]]