Удаление дублированных строк на основе условия (позиции) - PullRequest
1 голос
/ 29 сентября 2019

У меня есть набор данных, который выглядит примерно так:

df <- data.frame("id" = c("Alpha", "Alpha", "Alpha","Alpha","Beta","Beta","Beta","Beta"), 
                 "Year" = c(1970,1970,1970,1971,1980,1980,1981,1982), 
                 "Val" = c(2,3,-2,5,2,5,3,5))

У меня есть несколько наблюдений для каждого идентификатора и идентификатора времени - например, у меня есть 3 разных значения альфа 1970). Я хотел бы сохранить только одно наблюдение для каждого идентификатора / года, особенно последнее, которое появляется для каждого идентификатора / года. окончательный набор данных должен выглядеть примерно так:

final <- data.frame("id" = c("Alpha","Alpha","Beta","Beta","Beta"), 
                    "Year" = c(1970,1971,1980,1981,1982), 
                    "Val" = c(-2,5,5,3,5))

Кто-нибудь знает, как я могу решить проблему?

Заранее большое спасибо за помощь

Ответы [ 3 ]

2 голосов
/ 29 сентября 2019

Если вы открыты для решения data.table, это можно сделать довольно кратко:

library(data.table)

setDT(df)[, .SD[.N], by = c("id", "Year")]
#>       id Year Val
#> 1: Alpha 1970  -2
#> 2: Alpha 1971   5
#> 3:  Beta 1980   5
#> 4:  Beta 1981   3
#> 5:  Beta 1982   5

by = c("id", "Year") группирует таблицу данных по id и Year, и .SD[.N] затем возвращает последний ряд в каждой такой группе.

1 голос
/ 29 сентября 2019

Опция с base R

aggregate(Val ~ ., df, tail, 1)
#     id Year Val
#1 Alpha 1970  -2
#2 Alpha 1971   5
#3  Beta 1980   5
#4  Beta 1981   3
#5  Beta 1982   5

Если нам нужно выбрать первую строку

aggregate(Val ~ ., df, head, 1)
1 голос
/ 29 сентября 2019

Как насчет этого?

library(tidyverse)

df <- data.frame("id" = c("Alpha", "Alpha", "Alpha","Alpha","Beta","Beta","Beta","Beta"), 
                 "Year" = c(1970,1970,1970,1971,1980,1980,1981,1982), 
                 "Val" = c(2,3,-2,5,2,5,3,5))

final <- 
  df %>% 
  group_by(id, Year) %>% 
  slice(n()) %>% 
  ungroup()

final
#> # A tibble: 5 x 3
#>   id     Year   Val
#>   <fct> <dbl> <dbl>
#> 1 Alpha  1970    -2
#> 2 Alpha  1971     5
#> 3 Beta   1980     5
#> 4 Beta   1981     3
#> 5 Beta   1982     5

Создано в 2019-09-29 пакетом Представлять (v0.3.0)

Переводится как «в каждой группе id-Year, взять только строку, где номер строки равен размеру группы, т.е. это последняя строка в текущем порядке».

Вы также можете использовать либо filter(), например filter(row_number() == n()) или distinct() (и тогда вам даже не нужно будет группировать), например, distinct(id, Year, .keep_all = TRUE) - но функции distinct берут первую отдельную строку, поэтому вам нужно повернуть строку вспятьсначала заказ здесь.

...