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.bayat...@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 <ruipbarra...@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 <ruipbarra...@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 <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. > > >> > > >> 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@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: bayat...@yahoo.com > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. ______________________________________________ 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.