我正在清理管理数据集。我有两个问题,出于我的编码目的,我不确定回答这些问题的逻辑顺序。我有类似的数据:
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
中看到的,“ John Smith”有两个event 123
记录。
第二 ,这样做的事实是,在中间{{ 1}}对此有问题吗?如果是这样,我打算用以下方法将该列分开:
name
理想情况下,我的最终目标如下:
separate(df, name, c('name','middle'), " ")
答案 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)