简体   繁体   中英

How to switch values in two columns based on condition in R?

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"

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

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  

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM