R-在数据框的两列中删除相同的名称

时间:2019-05-29 19:25:50

标签: 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行中捕获了Adanel的名字,并让Belemir作为其配偶,因此我需要保留第1行,但删除第25行,因为这样做可以避免重复的数据。

我尝试了以下代码:

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

如何从数据帧寄存器中获得相同的配偶姓名寄存器?

P.S .:我需要它来避免区分大小写(Belemir == belemir),以免将来出现问题。

谢谢!

2 个答案:

答案 0 :(得分: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会将所有内容都转换为小写。

答案 1 :(得分:1)

我尝试使用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
)