Удаление повторяющихся строк на основе самой последней записи

1

Приношу свои извинения, поскольку я знаю, что варианты этого вопроса задавались раньше, но я попытался найти предоставленные ответы и не смог применить их к своим данным.

У меня есть следующие данные по результатам опроса. Несколько человек прошли опросы для участия в различных вебинарах. Человек мог пройти более одного опроса, если он посетил более одного вебинара. Я хотел бы сохранить только последние результаты опроса от каждого человека (т. Е. Удалить дубликаты, но сохранить самые последние результаты опроса на основе столбца «Дата отправки опроса»).

Образец текущих данных:

Name <- c("John", "Sara", "Nakita", "John", "Raj")
Webinar Code <- c(4, 4, 4, 2, 4)
Date Survey Submitted <- c("1/1/20", "1/1/20", "1/1/20", "1/15/20", "1/1/20")

Желаемый результат:

Name <- c("Sara", "Nakita", "John", "Raj")
Webinar Code <- c(4, 4, 2, 4)    
Date Survey Submitted <- c("1/1/20", "1/1/20", "1/15/20", "1/1/20")

Я ограничен в своих познаниях в R, но до сих пор использую функцию independent () для удаления повторяющихся строк. Но я не знаю, как добавить условие, чтобы сохранить строку с самой последней датой. Я надеюсь найти не слишком сложное решение. Заранее спасибо!

  • 1
    Вы можете сначала arrange(Date) а затем distinct() . Я не уверен, как сортируются даты, но я бы попробовал arrange(desc(Date)) в порядке убывания. Убедитесь, что даты являются фактическими датами, а не обычными строками, используя as.Date() иначе они будут отсортированы неправильно.
Теги:
CodeFix

3 ответа

0

Если вы хотите сохранить порядок, вы можете:

library(tidyverse)
library(lubridate)
dat %>%
  rownames_to_column("id") %>%
  arrange(desc(myd(Date_Survey_Submitted))) %>%
  filter(!duplicated(Name)) %>%
  arrange(id)%>%
  select(names(dat))

    Name Webinar_Code Date_Survey_Submitted
1   Sara            4                1/1/20
2 Nakita            4                1/1/20
3   John            2               1/15/20
4    Raj            4                1/1/20
Поделиться
Источник
0

Это хорошее приложениеdplyr::slice_max

library(tidyverse)

dat <- data.frame(Name = c("John", "Sara", "Nakita", "John", "Raj"),
           Webinar_Code = c(4, 4, 4, 2, 4),
           Date_Survey_Submitted = c("1/1/20", "1/1/20", "1/1/20", "1/15/20", "1/1/20"))

dat %>% 
  mutate(Date_Survey_Submitted = as.Date(Date_Survey_Submitted, "%m/%d/%y")) %>% 
  group_by(Name) %>% 
  slice_max(order_by = Date_Survey_Submitted, n = 1)
#> # A tibble: 4 x 3
#> # Groups:   Name [4]
#>   Name   Webinar_Code Date_Survey_Submitted
#>   <chr>         <dbl> <date>               
#> 1 John              2 2020-01-15           
#> 2 Nakita            4 2020-01-01           
#> 3 Raj               4 2020-01-01           
#> 4 Sara              4 2020-01-01

Создано 21.04.2021 пакетом REPEX (v1.0.0)

Поделиться
Источник
0

Вы можете изменить классDateSurveySubmitted на свидание,arrange данные на основе даты в порядке убывания и выберите первую строку для каждогоName .

library(dplyr)

df %>%
  mutate(DateSurveySubmitted = as.Date(DateSurveySubmitted, '%m/%d/%y')) %>%
  arrange(Name, desc(DateSurveySubmitted)) %>%
  distinct(Name, .keep_all = TRUE)

#    Name WebinarCode DateSurveySubmitted
#1   John           2          2020-01-15
#2 Nakita           4          2020-01-01
#3    Raj           4          2020-01-01
#4   Sara           4          2020-01-01

Или используяgroup_by и выберите максимальную строку для каждогоName .

df %>%
  mutate(DateSurveySubmitted = as.Date(DateSurveySubmitted, '%m/%d/%y')) %>%
  group_by(Name) %>%
  slice(which.max(DateSurveySubmitted)) %>%
  ungroup

данные

Name <- c("John", "Sara", "Nakita", "John", "Raj")
WebinarCode <- c(4, 4, 4, 2, 4)
DateSurveySubmitted <- c("1/1/20", "1/1/20", "1/1/20", "1/15/20", "1/1/20")
df <- data.frame(Name, WebinarCode, DateSurveySubmitted)
Поделиться
Источник

Другие вопросы

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум