В настоящее время я смотрю на банковские данные за 9 кварталов подряд. Теперь я хочу сохранить только те банки, по которым у меня есть данные за все 9 кварталов. Каждый банк имеет уникальный идентификационный номер. Как я могу фильтровать по идентификатору и хранить только банки с 9 последовательными наблюдениями?

Может быть, способ сделать это состоит в том, чтобы посчитать, как часто появляется удостоверение личности (сертификат), и сохранить только те, которые имеют 9 наблюдений? Вот что я попробовал:

df <- (...)   
a = rle(sort(df$cert))    
b = data.frame(id=a$values, n=a$lengths)   
c = subset(b, n==9)

Я не уверен, что это правильно, потому что я пытаюсь воспроизвести результаты исследования, но после этого шага цифры больше не совпадают.

r
1
carical 20 Авг 2018 в 15:50

3 ответа

Лучший ответ

Одним из вариантов будет n_distinct с group_by, сгруппированным по 'id', проверьте, равно ли число различных элементов в 'qtr' 9, и filter эти строки 'id'

library(dplyr)
df %>%
   group_by(id) %>% 
   filter(n_distinct(qtr) ==9)
2
akrun 20 Авг 2018 в 13:04

Сгенерированный пример. Используйте rowSums и !is.na для подсчета количества строк со значениями для всех 9 столбцов.

a[rowSums(!is.na(a))==9,]

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    4    7   10   13   16   19   22   25
[2,]    3    6    9   12   15   18   21   24   27

Данные использованы.

a <- matrix(1:27, ncol=9, nrow=3)
a[2,2] <- NA
a

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    4    7   10   13   16   19   22   25
[2,]    2   NA    8   11   14   17   20   23   26
[3,]    3    6    9   12   15   18   21   24   27
0
milan 20 Авг 2018 в 13:11
library(tidyverse)
df<-data.frame(id=rep(1:4,times=9),
               qtr=rep(1:9,each=4))

df%>%
  filter(id %in% (df%>%
                 count(id)%>%
                  filter(n>8)%>%.$id))
1
jyjek 20 Авг 2018 в 12:57
51931155