Я работаю с фреймом данных, который имеет два столбца: имя и супругу. Я пытаюсь рассчитать частоту межрасовых браков, но мне нужно удалить повторяющиеся регистры. Когда у меня есть имя существа, мне нужно сохранить этот регистр во фрейме данных, но удалить регистр, в котором имя этого существа является именем супруга. У меня есть следующий образец данных:
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.: Мне это нужно, чтобы избежать учета регистра (Белемир == белемир), чтобы у меня не было проблем в будущем.
Спасибо!
Вы можете настроить другой вектор с именами, отсортированными по строкам в алфавитном порядке, и выполнить дедупликацию, используя это...
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
преобразует все в нижний регистр.
@Codewraith Извините за это - я отредактировал ответ, чтобы решить эту проблему.
У меня больше нет ошибки, но это не решило мою проблему, у меня все еще есть 2 регистра, в которых есть Белемир, один как имя, а другой как супруг. IRM имеет такой же размер данных, поэтому я думаю, что он не удалил дубликаты. Ты знаешь почему?
@Codewraith Извините - попробуйте еще раз с исправленной версией выше - я думаю, что для этого нужен аргумент collapse
Моя попытка с 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
Это не ошибка, а предупреждение. Превратите name
и spouse
в символьный тип, и вы больше его не увидите.
Теперь происходит эта ошибка: Error: n() should only be called in a data context
Я только что изменил dat
(из вашего кода) на interacialMariage
(это мой фрейм данных). Вы знаете, почему эта ошибка происходит?
Это не сработало. Он показывает мне эту ошибку:
Error in sort(trimws(tolower(interacialMariage$name[i])), trimws(tolower(interacialMariage$spouse[i]))) : 'decreasing' must be a logic vector of length 1