Давайте начнем с ваших существующих данных:
df <- structure(list(combination = c("1_1", "1_2", "1_3", "1_4", "2_1",
"2_2", "2_3", "2_4"), color_1 = c("red", "red", "red", "red",
"blue", "blue", "blue", "blue"), color_2 = c("red", "blue", "green",
"yellow", "red", "blue", "green", "yellow")), class = "data.frame", row.names = c(NA,
-8L))
combination color_1 color_2
1 1_1 red red
2 1_2 red blue
3 1_3 red green
4 1_4 red yellow
5 2_1 blue red
6 2_2 blue blue
7 2_3 blue green
8 2_4 blue yellow
Одним из решений будет цикл по четырем категориям цветов, проверка на совпадения.
colors <- c('red', 'green', 'yellow', 'blue')
matches <- lapply(colors, function(x) {
out <- ifelse(with(df, color_1 == color_2 & color_1 == x), 1, 2)
out
})
И затем присвоение имен результатамэта операция с вашими именами столбцов.
names(matches) <- paste(colors, 'only', sep = '_')
И, наконец, склеивание результатов вместе с исходными данными:
df.new <- cbind(df, as.data.frame(matches))
combination color_1 color_2 red_only green_only yellow_only blue_only
1 1_1 red red 1 2 2 2
2 1_2 red blue 2 2 2 2
3 1_3 red green 2 2 2 2
4 1_4 red yellow 2 2 2 2
5 2_1 blue red 2 2 2 2
6 2_2 blue blue 2 2 2 1
7 2_3 blue green 2 2 2 2
8 2_4 blue yellow 2 2 2 2