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