#r #dplyr
Вопрос:
У меня есть csv-файл с 3 столбцами year
, netInc
, Organization
. Я хочу очистить данные и рассмотреть только ту Организацию, чьи ценности присутствуют во всех финансовых годах . Например, я хочу рассмотреть все годы между 2000 и 2003 годами (количество = 4) и не хочу данных B и D, так как у него есть данные только за несколько лет . Итак, как я должен это сделать, чтобы получить новый кадр данных, содержащий данные за 2000-2003 годы и 50 тыс. наблюдений?
Year netInc Org
2000 10 A
2001 20 A
2002 30 A
2003 40 A
2000 5 B
2001 7 B
2000 10 C
2001 20 C
2002 30 C
2003 40 C
2010 10 D
Ответ №1:
Мы можем использовать группу filter
, т. е. сгруппированную по «Организации», filter
только те «Организации», у all
которых » Год » с 2000 по 2003 год
library(dplyr)
df1 %>%
group_by(Org) %>%
filter(all(2000:2003 %in% Year)) %>%
ungroup
-выход
# A tibble: 8 x 3
Year netInc Org
<int> <int> <chr>
1 2000 10 A
2 2001 20 A
3 2002 30 A
4 2003 40 A
5 2000 10 C
6 2001 20 C
7 2002 30 C
8 2003 40 C
данные
df1 <- structure(list(Year = c(2000L, 2001L, 2002L, 2003L, 2000L, 2001L,
2000L, 2001L, 2002L, 2003L, 2010L), netInc = c(10L, 20L, 30L,
40L, 5L, 7L, 10L, 20L, 30L, 40L, 10L), Org = c("A", "A", "A",
"A", "B", "B", "C", "C", "C", "C", "D")),
class = "data.frame", row.names = c(NA,
-11L))
Комментарии:
1. Вы можете даже немного упростить, опустив
c(...)
; т. е. Заменитьfilter(all(c(2000:2003 %in% Year)))
наfilter(all(2000:2003 %in% Year))
.2. @banbh спасибо, извините, я не знал, почему я поставил
c()
, я изначально думал, что 2010 также должен быть там