Мы могли бы gather
в «длинный» формат, а затем создать группу для сравнения и объединения, чтобы получить ожидаемый результат
library(tidyverse)
gather(df1, key, val, -ID, -Final, na.rm = TRUE) %>%
group_by(ID) %>%
summarise(Status = !(all(unique(Final) %in% val) &
all(unique(val) %in% Final))) %>%
right_join(df1)
# A tibble: 6 x 8
# ID Status Final Val1 Val2 Val3 Val4 Val5
# <chr> <lgl> <chr> <chr> <chr> <lgl> <chr> <chr>
#1 P-1 TRUE A A 0 NA 0 0
#2 P-2 TRUE A 0 A NA B ""
#3 P-2 TRUE B 0 A NA B ""
#4 P-3 FALSE A A B NA B B
#5 P-3 FALSE B A B NA B B
#6 P-3 FALSE B A B NA B B
data
df1 <- structure(list(ID = c("P-1", "P-2", "P-2", "P-3", "P-3", "P-3"
), Final = c("A", "A", "B", "A", "B", "B"), Val1 = c("A", "0",
"0", "A", "A", "A"), Val2 = c("0", "A", "A", "B", "B", "B"),
Val3 = c(NA, NA, NA, NA, NA, NA), Val4 = c("0", "B", "B",
"B", "B", "B"), Val5 = c("0", "", "", "B", "B", "B")), .Names = c("ID",
"Final", "Val1", "Val2", "Val3", "Val4", "Val5"),
class = "data.frame", row.names = c(NA,
-6L))