[R] How to modify rows matching patter on multiple columns of dataframe?
Luigi Marongiu
m@rong|u@|u|g| @end|ng |rom gm@||@com
Fri Aug 13 15:09:01 CEST 2021
Thank you! both hacks worked as needed!
On Thu, Aug 12, 2021 at 6:59 PM Rui Barradas <ruipbarradas using sapo.pt> wrote:
>
> Hello,
>
> And another way, with which(., arr.ind = TRUE).
> In two steps, to make it clearer.
>
>
> i <- which(df[grep("var[123]", names(df))] == "a", arr.ind = TRUE)
> df[i] <- "z"
>
> df
> # var1 var2 var3 var4 var5
> #1 z A z 1 light
> #2 b B b 4 light
> #3 c C c 9 heavy
> #4 z D z 16 heavy
> #5 b E b 25 heavy
> #6 c F c 36 light
> #7 d G d 49 heavy
>
>
> Hope this helps,
>
> Rui Barradas
>
>
> Às 13:37 de 12/08/21, Luigi Marongiu escreveu:
> > Helo
> > I have a dataframe whose names are similar and I would like to change
> > the rows containing given values simultaneously.
> > I can select the columns using library(dplyr) but I can't modify the data:
> > ```
> > library(dplyr)
> >> df <- data.frame(var1 = c(letters[1:3], letters[1:4]),
> > + var2 = c(LETTERS[1:7]),
> > + var3 = c(letters[1:3], letters[1:4]),
> > + var4 = (1:7)^2,
> > + var5 = c("light", "light", "heavy", "heavy", "heavy",
> > + "light", "heavy"),
> > + stringsAsFactors = FALSE); df
> > var1 var2 var3 var4 var5
> > 1 a A a 1 light
> > 2 b B b 4 light
> > 3 c C c 9 heavy
> > 4 a D a 16 heavy
> > 5 b E b 25 heavy
> > 6 c F c 36 light
> > 7 d G d 49 heavy
> >> select(df, matches("var[123]"))
> > var1 var2 var3
> > 1 a A a
> > 2 b B b
> > 3 c C c
> > 4 a D a
> > 5 b E b
> > 6 c F c
> > 7 d G d
> >> df[[select(df, matches("var[123]")) == "a"]] <- "z"
> > Error in `[[<-`(`*tmp*`, i, value = value) :
> > recursive indexing failed at level 2
> >> df[[select(df, contains("var1")) == "a"]] <- "z"
> > Error in `[[<-`(`*tmp*`, i, value = value) :
> > recursive indexing failed at level 2
> > ```
> > If I sue which, I get a wrong substitution :
> > ```
> >> df[which(select(df, matches("var[123]")) == "a"), ] <- "z"; df
> > var1 var2 var3 var4 var5
> > 1 z z z z z
> > 2 b B b 4 light
> > 3 c C c 9 heavy
> > 4 z z z z z
> > 5 b E b 25 heavy
> > 6 c F c 36 light
> > 7 d G d 49 heavy
> > 8 <NA> <NA> <NA> <NA> <NA>
> > 9 <NA> <NA> <NA> <NA> <NA>
> > 10 <NA> <NA> <NA> <NA> <NA>
> > 11 <NA> <NA> <NA> <NA> <NA>
> > 12 <NA> <NA> <NA> <NA> <NA>
> > 13 <NA> <NA> <NA> <NA> <NA>
> > 14 <NA> <NA> <NA> <NA> <NA>
> > 15 z z z z z
> > 16 <NA> <NA> <NA> <NA> <NA>
> > 17 <NA> <NA> <NA> <NA> <NA>
> > 18 z z z z z
> > ```
> >
> > what is the correct syntax?
> > Thank you
> >
--
Best regards,
Luigi
More information about the R-help
mailing list