R - Удаление одного и того же имени в двух столбцах фрейма данных

Я работаю с фреймом данных, который имеет два столбца: имя и супругу. Я пытаюсь рассчитать частоту межрасовых браков, но мне нужно удалить повторяющиеся регистры. Когда у меня есть имя существа, мне нужно сохранить этот регистр во фрейме данных, но удалить регистр, в котором имя этого существа является именем супруга. У меня есть следующий образец данных:

                    name                      spouse
15                  Finarfin                  Eärwen
6             Tar-Vanimeldë                  Herucalmo
17                   Faramir                  owyn
8               Tar-Meneldur                  Almarian
14   Finduilas of Dol Amroth                  Denethor II
12                    Finwë                  Míriel Serindë then ,Indis
9              Tar-Ancalimë                  Hallacar
7                Tar-Míriel                   Ar-Pharazôn
5          Tarannon Falastur                  Berúthiel
21             Rufus Burrows                  Asphodel Brandybuck
2                     Angrod                  Eldalótë
4               Ar-Gimilzôr                  Inzilbêth
19 Lobelia Sackville-Baggins                  Otho Sackville-Baggins
25            Mrs. Proudfoot                  Odo Proudfoot
22            Rudigar Bolger                  Belba Baggins
24             Odo Proudfoot                  Mrs. Proudfoot
3               Ar-Pharazôn                  Tar-Míriel
13                 Fingolfin                  Anairë
18                Silmariën                  Elatan
23           Rowan Greenhand                  Belba Baggins
20                     Rían                   Huor
1                     Adanel                  Belemir
16           Fastolph Bolger                  Pansy Baggins
10         Morwen Steelsheen                  Thengel
11              Tar-Aldarion                  Erendis
25              Belemir                       Adanel     

Например, я запустил код, и в строке 1 он поймал имя Аданель и получил Белемира в качестве своего супруга, поэтому мне нужно сохранить строку 1, но удалить строку 25, потому что с ее помощью я избегаю дублирования данных.

Я пробовал следующий код:

interacialMariage <-data %>% filter(spouse != name) %>% select(name, spouse)

Как я могу получить тот же регистр имен супругов из регистров фрейма данных?

P.S.: Мне это нужно, чтобы избежать учета регистра (Белемир == белемир), чтобы у меня не было проблем в будущем.

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете настроить другой вектор с именами, отсортированными по строкам в алфавитном порядке, и выполнить дедупликацию, используя это...

sorted <- sapply(1:nrow(data), 
                 function(i) paste(sort(c(trimws(tolower(data$name[i])),
                                        trimws(tolower(data$spouse[i])))),
                                   collapse = " ")) 
irM <- data[!duplicated(sorted),]

trimws удаляет все начальные или конечные пробелы перед сортировкой и вставкой, а tolower преобразует все в нижний регистр.

Это не сработало. Он показывает мне эту ошибку: Error in sort(trimws(tolower(interacialMariage$name[i])), trimws(tolower(interacialMariage$spouse[i]))) : 'decreasing' must be a logic vector of length 1

Codewraith 30.05.2019 02:00

@Codewraith Извините за это - я отредактировал ответ, чтобы решить эту проблему.

Andrew Gustar 30.05.2019 08:27

У меня больше нет ошибки, но это не решило мою проблему, у меня все еще есть 2 регистра, в которых есть Белемир, один как имя, а другой как супруг. IRM имеет такой же размер данных, поэтому я думаю, что он не удалил дубликаты. Ты знаешь почему?

Codewraith 30.05.2019 21:40

@Codewraith Извините - попробуйте еще раз с исправленной версией выше - я думаю, что для этого нужен аргумент collapse

Andrew Gustar 30.05.2019 22:23

Моя попытка с tidyverse:

library(tidyverse)

dat %>%
  mutate(id = 1:n()) %>%           # add id to label the pairs
  gather('key', 'name', -id) %>%   # transform: key (name | spouse), name, id
  group_by(name) %>%               # group by unique name to find duplicated
  top_n(-1, wt = id) %>%           # if name > 1, take row with the lower id
  spread(key, name) %>%            # spread data to original format
  select(-id)                      # remove id's

# # A tibble: 3 x 2
#   name              spouse       
#   <chr>             <chr>        
# 1 Adanel            Belemir      
# 2 Fastolph Bolger   Pansy Baggins
# 3 Morwen Steelsheen Thengel  

Данные:

dat <- data.frame(
  name   = c("Adanel",  "Fastolph Bolger", "Morwen Steelsheen", "Belemir"),
  spouse = c("Belemir", "Pansy Baggins",   "Thengel",           "Adanel" ),
  stringsAsFactors = F
)

Я пробовал этот код: interacialMariage %>% + your code. Он показал эту ошибку: Warning message: attributes are not identical across measure variables; they will be dropped

Codewraith 30.05.2019 02:06

Это не ошибка, а предупреждение. Превратите name и spouse в символьный тип, и вы больше его не увидите.

utubun 30.05.2019 07:28

Теперь происходит эта ошибка: Error: n() should only be called in a data context Я только что изменил dat (из вашего кода) на interacialMariage (это мой фрейм данных). Вы знаете, почему эта ошибка происходит?

Codewraith 30.05.2019 21:46

Другие вопросы по теме