Устранение повторяющихся значений на основе критериев в R - PullRequest
1 голос
/ 05 февраля 2020

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

name <- c("Smith, John J", "Smith, John Jay", "Smith, Jane", "Smith, Joe M")
event <- c('123', '123', '124', '125')
type <- c('s', 'a', 'v', 's')
df <- data.frame(name, event,type)

Первый , я хочу исключить дополнительную запись event для лиц, которые имеют type = 'a' и type = 's' записей. Когда у них есть оба, я хочу только запись с наблюдением type = 'a'. Примечание : это условно, если запись event совпадает. Как вы можете видеть в df есть две event 123 записи для «Джона Смита».

Second , делает тот факт, что есть люди, которые имеют их второе имя прописано по сравнению с просто инициалом, и те, у кого нет указанного второго имени / инициала в поле name, представляют для этого проблему? Если это так, я планировал выделить этот столбец следующим образом:

separate(df, name, c('name','middle'), " ")

В идеале моя конечная цель должна выглядеть следующим образом:

           name event type
1 Smith, John J   123    a
2   Smith, Jane   124    v
3  Smith, Joe M   125    s

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Чтобы сделать это, учитывая возможные несоответствия в отчествах, вам придется разделить имя на различные компоненты:

# Be careful about the stringsAsFactors setting
df <- data.frame(name, event, type, stringsAsFactors = FALSE)

df %>%
  separate(name, c("last", "other"), sep = ", ", remove = FALSE) %>%
  separate(other, c("first", "middle"), sep = " ", fill = "right") %>%
  # Treat people as the same individual if their first and last names
  #   match, ignore middle name
  group_by(first, last, event) %>%
  # Put 'a' records first
  arrange(desc(type == "a")) %>%
  slice(1)
1 голос
/ 05 февраля 2020

После группировки по 'event' и 'grp', созданным путем удаления последнего слова в 'name', затем переупорядочиваем 'name' на основе вхождения 'a' в 'type' и slice последнего элемента

library(dplyr)
library(stringr)
df %>%
    group_by(event, grp = str_remove(name, "\\s*\\w+$")) %>%
    mutate(name = name[order(type != 'a')]) %>% 
    slice(n()) %>% 
    ungroup %>%
    select(-grp)
# A tibble: 3 x 3
# Groups:   event [3]
#  name          event type 
#  <fct>         <fct> <fct>
#1 Smith, John J 123   a    
#2 Smith, Jane   124   v    
#3 Smith, Joe M  125   s    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...