sheet - dplyr seleccionar utilizando lógica
tidyr (3)
Como Ben sugirió:
select(dat, which(isNum))
¿Puede select
en dplyr ser utilizado con un vector lógico?
dat <- tbl_df(mtcars)
isNum <- sapply(dat, is.numeric)
select(dat, isNum)
select(dat, isNum)
Error en los nombres (sel) [sin nombre] <- sel [sin nombre]: las NA no están permitidas en las asignaciones de subíndices
Los índices funcionan: select(dat,(1:ncol(dat))[isNum])
entonces, ¿por qué no un lógico?
Cuando vi funciones de ayuda para seleccionar como starts_with
select(dat,starts_with("m"))
asumí que funcionarían con un lógico ...
Como se indicó muy claramente en otras respuestas, la respuesta a su pregunta específica es no . No puede usar un vector lógico en dplyr::select()
.
Sin embargo, en las versiones más recientes de dplyr (v> = 0.5.0) hay una nueva función que admite el uso de una función de predicado que se aplicará a las columnas o un vector lógico : select_if() .
Usando select_if
con una función de predicado, su ejemplo podría simplificarse de la siguiente manera:
tbl_df(mtcars) %>% dplyr::select_if(is.numeric)
Pero, también puedes usar select_if
con un vector lógico. Esto aborda más directamente su caso de uso anterior, que se vería como el siguiente:
dat <- tbl_df(mtcars)
isNum <- sapply(dat, is.numeric)
select_if(dat, isNum)
Mis respuestas serían:
- no ("¿Puede seleccionarse en
dplyr
ser usado con un vector lógico?")
evidencia : (1) su ejemplo, (2) la página de ayuda:
...: Lista separada por comas de expresiones sin comillas. Puedes tratar los nombres de variables como si fueran posiciones. Use valores positivos para seleccionar variables; Usa valores negativos para soltar variables.
No dice nada sobre vectores lógicos. Lo siento.
- No sé ("¿por qué no un lógico?") - ''solo porque'' (no creo que nadie, excepto el desarrollador, realmente pueda responder esto). Usted podría poner en una solicitud de función ...
Es un poco torpe, pero
select_(dat,.dots=names(isNum)[isNum])
funciona (tenga en cuenta que necesita la variante select_
para permitir el uso de un vector de caracteres). Pero buena pasada de moda
subset(dat,select=isNum)
parece funcionar bien también (a menos que no juegue bien con dplyr
de alguna otra manera que no haya pensado).
Si observa el código de dplyr:::starts_with
, puede ver que devuelve un vector de posiciones, no un vector lógico
function (vars, match, ignore.case = TRUE)
{
stopifnot(is.string(match), !is.na(match), nchar(match) >
0)
if (ignore.case)
match <- tolower(match)
n <- nchar(match)
if (ignore.case)
vars <- tolower(vars)
which(substr(vars, 1, n) == match)
}
Iba a sugerir que intentas modificar esta función para crear un equivalente is_numeric
, pero no entiendo la magia subyacente lo suficiente ...