replacing a set of strings over multiple columns

Hello,

I want to change strings into other strings (or numbers, for that matter) over multiple columns.
Tried to do this the way below:

baza <- baza |> mutate(across(c(2:23), case_match("nigdy"~ 0,
                                                               "raz lub dwa razy w życiu"~ 1,
                                                               "nie częściej niż raz w roku"~ 2,
                                                               "raz na kilka miesięcy"~ 3,
                                                               "co najmniej raz w miesiącu"~ 4,
                                                               "co najmniej raz w tygodniu"~ 5,
                                                               "wiele razy w tygodniu"~ 6,
                                                               "codziennie"~ 7)))

but get the error: ".x must be a vector, not a object."

How best to replace a set of strings with another set over multiple columns ?
Is it better to use str_replace_all here instead of case_when / case_match ?

(

Does the following code do what you want?

library(tidyverse)
baza <- data.frame(A = c("nigdy","nie częściej niż raz w roku","raz na kilka miesięcy",
                         "co najmniej raz w miesiącu","co najmniej raz w tygodniu",
                         "wiele razy w tygodniu", "codziennie"),
                   B = c("Z","nie częściej niż raz w roku","raz na kilka miesięcy",
                         "co najmniej raz w miesiącu","W",
                         "wiele razy w tygodniu", "codziennie"),
                   C = c("nigdy","D","E",
                         "co najmniej raz w miesiącu","co najmniej raz w tygodniu",
                         "wiele razy w tygodniu", "codziennie"),
                   D = LETTERS[5:11]
                   )
baza
#>                             A                           B
#> 1                       nigdy                           Z
#> 2 nie częściej niż raz w roku nie częściej niż raz w roku
#> 3       raz na kilka miesięcy       raz na kilka miesięcy
#> 4  co najmniej raz w miesiącu  co najmniej raz w miesiącu
#> 5  co najmniej raz w tygodniu                           W
#> 6       wiele razy w tygodniu       wiele razy w tygodniu
#> 7                  codziennie                  codziennie
#>                            C D
#> 1                      nigdy E
#> 2                          D F
#> 3                          E G
#> 4 co najmniej raz w miesiącu H
#> 5 co najmniej raz w tygodniu I
#> 6      wiele razy w tygodniu J
#> 7                 codziennie K
baza <- baza |> mutate(across(c(1:3), .fns = ~case_match(.x, 
                                                         "nigdy"~ 0,
                                                  "raz lub dwa razy w życiu"~ 1,
                                                  "nie częściej niż raz w roku"~ 2,
                                                  "raz na kilka miesięcy"~ 3,
                                                  "co najmniej raz w miesiącu"~ 4,
                                                  "co najmniej raz w tygodniu"~ 5,
                                                  "wiele razy w tygodniu"~ 6,
                                                  "codziennie"~ 7, .default = NA)))
baza
#>   A  B  C D
#> 1 0 NA  0 E
#> 2 2  2 NA F
#> 3 3  3 NA G
#> 4 4  4  4 H
#> 5 5 NA  5 I
#> 6 6  6  6 J
#> 7 7  7  7 K

Created on 2024-03-04 with reprex v2.0.2

Try mutate(across(2:23, ~ case_match(.x, "nigdy" ~ 1, ..., "codziennie" ~ 7))).

1 Like

Both solutions, by @FJCC and @prubin, solve the problem (can't pick both as solution, the first one then ;). Thanks guys!
Also possible:

mutate(across(2:23, \(x)  case_match(x, "nigdy" ~ 1, ..., "codziennie" ~ 7)))

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.