2

My code is:

data$E<-ifelse(data$D==data$B, "b", ifelse(data$D==data$C, "c", "unknowwn"))

result:

  A   B   C   D   E
1 16  16  NA  16  b
2 20  NA  20  20  NA
3 24  NA  NA  24  NA

But what I want is:

  A   B   C   D   E
1 16  16  NA  16  b
2 20  NA  20  20  c
3 24  NA  NA  24  unknowwn

Dose anyone know how to solve this problem? Thanks!

Amber Tseng
  • 65
  • 2
  • 8
  • Welcome to Stack Overflow! Please provide [example data](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610) in order to make your issue reproducible! – jay.sf Jul 15 '18 at 13:33

2 Answers2

3
data$E <- ifelse(!is.na(data$B) & data$D == data$B, "b", 
            ifelse(!is.na(data$C) & data$D == data$C, "c", "unknowwn"))
A. Suliman
  • 12,923
  • 5
  • 24
  • 37
3

Your condition is a bit complicated as you need to consider if either of columns B, C or D contains NA. Hence, you can try consider using dplyr::case_when as:

Edited: Based on suggestion from @A.Suliman there is no need to have checking for is.na with case_when.

library(dplyr)

data %>% mutate( E = case_when(
  D==B ~ "b",
  D==C ~ "c",
  TRUE ~ "Unknown"
))

#    A  B  C  D       E
# 1 16 16 NA 16       b
# 2 20 NA 20 20       c
# 3 24 NA NA 24 Unknown

Data:

data <- read.table(text= 
"A   B   C   D   
1 16  16  NA  16  
2 20  NA  20  20
3 24  NA  NA  24",
header = TRUE)
MKR
  • 19,739
  • 4
  • 23
  • 33
  • 1
    No need for testing NA with `case_when`, I think `dplyr` magic works. See data %>% mutate(E = case_when(D==B ~ 'b',D==C ~ 'C', TRUE ~ 'Unknown')) – A. Suliman Jul 15 '18 at 13:46