Как удалить строки с уникальным идентификатором из фрейма данных панели в R? - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть таблица данных, содержащая тысячи фирм, которые можно идентифицировать по уникальному идентификатору.Это данные в длинном формате, и каждая фирма должна появляться дважды в разные годы (временные ряды в разрезе за два года).

Однако не все фирмы появляются в оба года, и я пытаюсь создатьсбалансированная панель длинных форматов, в которой остаются только фирмы, появляющиеся в оба года.Как мне это сделать?

Это пример таблицы данных для иллюстрации проблемы:

example <- matrix(c(1,1,2,3,3,2013,2016,2013,2013,2016), ncol=2)
colnames(example) <- c('id', 'year')
example.table <- data.table(example)
example.table

   id year
1:  1 2013
2:  1 2016
3:  2 2013
4:  3 2013
5:  3 2016

В этом примере мне нужен код / ​​функция, которая позволяет исключить строкуфирма с идентификатором «2», потому что в 2016 году она не соответствует. Другими словами: мне нужен код / ​​функция, которая сравнивает каждую строку с предыдущей и последующей строкой и исключает ее, если в столбце идентификатора нет соответствия.

Я потратил много часов, но, похоже, достиг предела своих знаний R и был бы признателен за любую поддержку.Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Используя dplyr, как показано ниже:

library(dplyr)
example.table %>%
  group_by(id) %>%
  filter(n() > 1)
# A tibble: 4 x 2
# Groups:   id [2]
     id  year
  <dbl> <dbl>
1     1  2013
2     1  2016
3     3  2013
4     3  2016
1 голос
/ 11 апреля 2019

Мы создаем вектор из unique 'year' из всего набора данных, затем проверяем, являются ли all значения в 'nm1' %in% 'year' сгруппированными по 'id' и подмножество data.table

un1 <- unique(example.table$year)
example.table[, .SD[all(un1 %in% year)], id]
#   id year
#1:  1 2013
#2:  1 2016
#3:  3 2013
#4:  3 2016

ПРИМЕЧАНИЕ. Набор данных OP - data.table, а используемый здесь метод - data.table.Первоначально задумывался об использовании .SD[uniqueN(year) > 1], но это неправильно и может работать не во всех случаях

0 голосов
/ 11 апреля 2019

data.table эквивалентное решение @ Sonny's dplyr решение

example.table[, if(.N > 1) .SD, id]

   id year
1:  1 2013
2:  1 2016
3:  3 2013
4:  3 2016
...