根据R中的条件消除重复值

时间:2020-02-04 22:47:32

标签: r subset tidyverse

我正在清理管理数据集。我有两个问题,出于我的编码目的,我不确定回答这些问题的逻辑顺序。我有类似的数据:

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)

第一 ,我想为同时拥有eventtype = 'a'记录的个人删除额外的type = 's'记录。当它们同时存在时,我只希望记录带有type = 'a'的记录。 注意 :这取决于event记录是否相同。如您在df中看到的,“ John Smith”有两个event 123记录。

第二 ,这样做的事实是,在中间{{ 1}}对此有问题吗?如果是这样,我打算用以下方法将该列分开:

name

理想情况下,我的最终目标如下:

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

2 个答案:

答案 0 :(得分:1)

按“事件”分组并通过删除“名称”中的最后一个单词而创建的“ grp”分组后,然后根据“类型”中的“ a”和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    

答案 1 :(得分:1)

要在考虑中间名称可能存在的不一致的情况下执行此操作,您必须将名称拆分为不同的组成部分:

# 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)
相关问题