Прежде всего, было бы неплохо, если вместо character
используется вектор logical
, тогда вы можете написать Control
вместо Control == "TRUE"
и !Control
вместо Control == "FALSE"
. И ваш код будет короче.
Для вашей задачи я буду использовать несколько ifelse
:
RDTbase$Result <- ifelse(
Control == "TRUE",
ifelse(
Pf == "TRUE",
ifelse(Pv == "TRUE","Mixed","Pf"), # when Control is TRUE, Pf is TRUE
ifelse(Pv == "TRUE","Pv","Negative"), # when Control is TRUE, Pf is FALSE
),
"Invalid" # when Control is FALSE
)
Но мне нравятся фокусы, чтобы вы могли следовать:
num_code <- (
as.numeric(as.logical(Control))
+ 2*as.numeric(as.logical(Pf))
+ 4*as.numeric(as.logical(Pv))
) # values are 0,1,2,...,7
# then
RDTbase$Result <- c(
"Invalid" , # 0 = F,F,F # Control, Pf, Pv
"Negative", # 1 = T,F,F
"Invalid" , # 2 = F,T,F
"Pf" , # 3 = T,T,F
"Invalid" , # 4 = F,F,T
"Pv" , # 5 = T,F,T
"Invalid" , # 6 = F,T,T
"Mixed" , # 7 = T,T,T
)[num_code+1]
Это хороший трюк, когда вам нужно декодировать несколько логических столбцов в символ.