R - удаление одного и того же имени в двух столбцах фрейма данных - PullRequest
0 голосов
/ 29 мая 2019

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

                    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 он поймал имя Adanel и получил Belemir в качестве супруга, поэтому мне нужно сохранить строку 1, но удалить строку 25потому что с этим я буду избегать дублирования данных.

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

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

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

PS: Мне нужно, чтобы он не учитывал регистр символов (Belemir == belemir), чтобы у меня не было проблем в будущем.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

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

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 преобразует все в нижний регистр.

1 голос
/ 29 мая 2019

Моя попытка с 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...