In example-dataset below, I need to switch the values in column "d_code" with values in column "c_code", if value in column "d_code" begins with anything but "7" and "8".
sample_df <- tibble::tribble(
~sum, ~d_code, ~c_code,
98, "1200", "7300",
73, "1500", "8300",
62, "8400", "1050")
The desired output would look like this:
sum d_code c_code
98 "7300" "1200"
73 "8300" "1500"
62 "8400" "1050"
CodePudding user response:
Using base R
,
sample_df[!(substr(sample_df$d_code,1,1) %in% c(7,8)), c("d_code", "c_code") ] <- sample_df[!(substr(sample_df$d_code,1,1) %in% c(7,8)), c("c_code", "d_code") ]
sample_df
sum d_code c_code
<dbl> <chr> <chr>
1 98 7300 1200
2 73 8300 1500
3 62 8400 1050
or
transform(sample_df, d_code = ifelse(
!(substr(sample_df$d_code,1,1) %in% c(7,8)),
c_code,
d_code
),
c_code = ifelse(
!(substr(sample_df$d_code,1,1) %in% c(7,8)),
d_code,
c_code
)
)
CodePudding user response:
Here is a tidyverse
solution:
update thanks to Martin Gal (see comments): removed ,
in [7,8]
library(dplyr)
library(stringr)
sample_df %>%
mutate(across(ends_with("code"), ~ifelse(str_detect(.,"^[78]"), d_code, c_code)))
sum d_code c_code
<dbl> <chr> <chr>
1 98 7300 1200
2 73 8300 1500
3 62 8400 1050
CodePudding user response:
Using ifelse
sample_df$d_code1 = ifelse(sample_df$d_code > 2000, sample_df$d_code, sample_df$c_code)
sample_df$c_code1 = ifelse(sample_df$c_code > 7000, sample_df$d_code, sample_df$c_code)
d_code1
and c_code1
the new coloumns.