Я работаю с набором данных, у которого есть структура, с которой я раньше не работал. У него есть этот формат (код для ввода данных в конце):
df
#> Instance Alice_prefers Bob_prefers Charlie_prefers
#> 1 1 Bob Charlie Alice
#> 2 2 Bob Alice Bob
#> 3 3 Bob Charlie Bob
Я пытаюсь создать переменную, которая показывает, когда два человека "совпадают", т.е. когда они оба предпочитают друг друга, например, еслиАлиса предпочитает Боба, а Боб также предпочитает Алису - это взаимное совпадение: Алиса и Боб совпадают.
Итак, мой желаемый результат:
output
#> Instance Alice_prefers Bob_prefers Charlie_prefers Match
#> 1 1 Bob Charlie Alice <NA>
#> 2 2 Bob Alice Bob AliceBob
#> 3 3 Bob Charlie Bob BobCharlie
Использование case_when()
, кажется, делаетхитрость, но есть ли более простой способ, чем перечисление каждого отдельного случая, как я начал делать ниже? В моем реальном наборе данных я буду искать, чтобы у меня было намного больше людей, чем просто Алиса, Боб и Чарли.
Второй вопрос:
Когда у меня будет больше людей,например. Алиса, Боб, Чарли и Дениз, столбец Match
может содержать несколько совпадений (например, совпадение Алисы и Боба и совпадение Чарли и Дениз) - каково это решение? Должен ли я иметь индикаторную переменную для каждого возможного совпадения, например, AliceBob, AliceCharlie и т. Д., Которая принимает значение 1 или 0?
Причина, по которой я это делаю: я бы хотела иметь возможностьбыстро посмотрите на количество совпадений и кто в матчах.
#df <- df %>% mutate(Match = ifelse(Alice_prefers=="Bob" & Bob_prefers =="Alice", "AliceBob", NA))
df <- df %>% mutate(
Match = case_when(
(Alice_prefers=="Bob" & Bob_prefers=="Alice") ~ "AliceBob",
(Charlie_prefers=="Bob" & Bob_prefers=="Charlie") ~ "BobCharlie"
)
)
df
Код для ввода данных:
df <- data.frame(stringsAsFactors=FALSE,
Instance = c(1, 2, 3),
Alice_prefers = c("Bob", "Bob", "Bob"),
Bob_prefers = c("Charlie", "Alice", "Charlie"),
Charlie_prefers = c("Alice", "Bob", "Bob")
)