Можно ли выбрать переменную, а затем некоторые другие переменные по условию в одном вызове в R? - PullRequest
2 голосов
/ 10 марта 2020

Я играю с базой данных flights, которая включена в библиотеку nycflights13, и я подумал, что может быть интересно выбрать одну (или любое количество) переменных вручную, а затем некоторые другие по условию (например, «перевозчик», а затем все числовые c переменных). Это можно сделать в три этапа, например:

library(nycflights13)
data(flights)
flights
a <- flights[,"carrier", drop=FALSE]
b <- flights[, lapply(flights,is.numeric) == TRUE, drop=FALSE]
ab <- cbind(a,b)
str(ab) # 'data.frame':   336776 obs. of  15 variables:

Но это не работает:

flights[, "carrier" & c(lapply(flights,is.numeric)) == TRUE, drop=FALSE]
flights[, "carrier" & lapply(flights,is.numeric) == TRUE, drop=FALSE]

Error in "carrier" & lapply(flights, is.numeric) == TRUE : 
  solo son posibles operaciones para variables de tipo numérico, compleja o lógico

Я должен сказать, select_if из tidyverse также бесполезно .

Итак, мой вопрос: возможно ли достичь того, что я хочу сделать, одним вызовом и как это можно сделать? Спасибо за любой комментарий или предложение

1 Ответ

5 голосов
/ 10 марта 2020

Вместо lapply мы можем использовать sapply. Он будет выдавать логический вывод, использовать его для извлечения имен или использовать which, а затем объединять с 'carrier'

flights[, c("carrier", names(flights)[sapply(flights, is.numeric)]) , drop=FALSE]

. drop не требуется для tibble, как по умолчанию не упадет


При dplyr один вариант -

library(dplyr)
flights %>% 
       select(carrier,  select_if(., is.numeric) %>% names)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...