usar sheet mutate meaning functions como cheat r dplyr

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 ...