Возврат значений столбца по условию другого столбца - PullRequest
0 голосов
/ 16 октября 2018

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

subset(planes$year, planes$type == "Fixed wing multi engine" & 
planes$type == "Fixed wing single engine" & planes$type == "Rotorcraft")

И несколько попыток с dplyr:

    planes %>% filter(type == "Fixed wing multi engine" & 
type == "Fixed wing single engine" & type == "Rotorcraft")%>% group_by(year)  

Это не сработало.Как бы я поступил так?Спасибо

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вот маршрут dplyr.Ключ (а) - group_by() год в первую очередь и (б) использование функции n_distinct().

planes %>% group_by(year) %>% filter(n_distinct(type) == 3)

Примечание: этот код неявно предполагает, что данные не имеют других type счем «Фиксированное крыло с несколькими двигателями», «Фиксированное крыло с одним двигателем» и «Rotorcraft».Это верно для planes данных, но не всегда.Может быть предпочтительнее сделать это предположение явным, но это приведет к увеличению длины кода.

planes %>% 
group_by(year) %>% 
filter("Fixed wing multi engine" %in% type & 
       "Rotorcraft" %in% type & 
       "Fixed wing single engine" %in% type)
0 голосов
/ 16 октября 2018

Просто, чтобы выразить это, вот базовое решение R, использующее ave() -

n_types <- length(unique(planes$type))

unique(
  planes$year[ave(planes$type, planes$year, FUN = function(x) length(unique(x))) == n_types]
)

[1] 1985 1975
0 голосов
/ 16 октября 2018

Помните, что subset и filter работают со строками.Таким образом, одна строка не может содержать все 3 типа.

Один из подходов - группировать по годам, а затем подсчитывать количество различных типов.Поскольку вы заранее знаете, что существует 3 типа, вы можете отфильтровать это число:

library(dplyr)

planes %>% 
  group_by(year) %>%
  filter(n_distinct(type) == 3)

. Это возвращает 26 строк.Вы можете использовать count() или distinct(), чтобы показать, что эти годы - 1975 и 1985.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...