我正在处理一个具有两列的数据框,名称和配偶。我正在尝试计算异族结婚的频率,但是我需要删除重复的记录。 当我有一个生物的名字时,我需要将此寄存器保留在数据框中,但要删除该生物名称为配偶名字的寄存器。我有以下数据示例:
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),以免将来出现问题。
谢谢!
答案 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
)