1) R as.matrix(DF[5:9]) == XO
, DF[5:9]
. wm
. wm
which.max
, , NA
, TRUE, .. NA FALSE. , which.max
wm
, . TRUE, .
wm <- function(x) if (isTRUE(any(x))) which.max(x) else NA
transform(DF, Flag = apply(as.matrix(DF[-(1:4)]) == XO, 1, wm))
:
ID Measure1 Measure2 XO x1 x2 x3 x4 x5 Flag
1 1 30 2 item1 item1 item23 <NA> item6 item9 1
2 2 23 2 item1 item323 item1 item4 item5 <NA> 2
3 3 2 2 item1 item78 item3 <NA> item1 item5 4
2) dplyr/tidyr , , x1,..., xn . , tidyr gather
, , XO :
library(dplyr)
library(tidyr)
DF %>%
left_join(DF %>% gather(Flag, item, -(1:4)) %>% filter(item == XO)) %>%
select(-item) %>%
mutate(Flag = match(Flag, names(DF)[-(1:4)]))
:
ID Measure1 Measure2 XO x1 x2 x3 x4 x5 Flag
1 1 30 2 item1 item1 item23 <NA> item6 item9 1
2 2 23 2 item1 item323 item1 item4 item5 <NA> 2
3 3 2 2 item1 item78 item3 <NA> item1 item5 4
3) . dplyr/tidyr. reshape
, Flag :
r <- reshape(DF, list(names(DF)[-(1:4)]), "X", "Flag", direction = "long")
s <- subset(r, X == XO)[c("ID", "Flag")]
merge(DF, s, all.x = TRUE)
:
ID Measure1 Measure2 XO x1 x2 x3 x4 x5 Flag
1 1 30 2 item1 item1 item23 <NA> item6 item9 1
2 2 23 2 item1 item323 item1 item4 item5 <NA> 2
3 3 2 2 item1 item78 item3 <NA> item1 item5 4
.. , . , , .
Lines <- " ID Measure1 Measure2 XO x1 x2 x3 x4 x5
1 30 2 item1 item1 item23 NA item6 item9
2 23 2 item1 item323 item1 item4 item5 NA
3 2 2 item1 item78 item3 NA item1 item5"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)