[Solved] Ifelse to Compare the content of columns with dplyr

[ad_1]

The best way to do this would be to use the glue package. This allows you to easily assign variable names based on strings:

library(tidyverse)
library(glue)

> df <- data.frame(
    sample_id = c('SB013', 'SB014', 'SB013', 'SB014', 'SB015', 'SB016', 'SB016'), 
    IN = c(1,2,3,4,5,6,7), 
    OUT = c(rep('out',7)))

> df
  sample_id IN OUT
1     SB013  1 out
2     SB014  2 out
3     SB013  3 out
4     SB014  4 out
5     SB015  5 out
6     SB016  6 out
7     SB016  7 out

> df %>% mutate(`SB013` = ifelse(sample_id == 'SB013', IN, OUT))

  sample_id IN OUT SB013
1     SB013  1 out     1
2     SB014  2 out   out
3     SB013  3 out     3
4     SB014  4 out   out
5     SB015  5 out   out
6     SB016  6 out   out
7     SB016  7 out   out

Note that in this case, the dplyr command if_else won’t work because IN and OUT are of different types. If it is a large dataset, I would suggest using a function with vectorisation (map or lapply), but if there are only 4 unique sample_id:

> list_of_ids <- 
    df %>% 
    distinct(sample_id) %>%
    unlist() %>%
    unname()

> list_of_ids
[1] "SB013" "SB014" "SB015" "SB016"


> for(current_id in list_of_ids){
df <- 
    df %>% 
    mutate('{current_id}' := ifelse(sample_id == current_id, IN, OUT))
}

> df
  sample_id IN OUT SB013 SB014 SB015 SB016
1     SB013  1 out     1   out   out   out
2     SB014  2 out   out     2   out   out
3     SB013  3 out     3   out   out   out
4     SB014  4 out   out     4   out   out
5     SB015  5 out   out   out     5   out
6     SB016  6 out   out   out   out     6
7     SB016  7 out   out   out   out     7

In future, please add sample data and expected output to your question.

[ad_2]

solved Ifelse to Compare the content of columns with dplyr