Tengo un marco de datos ("datos") con muchas, muchas columnas. Algunas de las columnas contienen una determinada cadena ("search_string").
¿Cómo puedo usar dplyr::select()
para darme un subconjunto que incluya solo las columnas que contienen la cadena?
Lo intenté:
# columns as boolean vector
select(data, grepl("search_string",colnames(data)))
# columns as vector of column names names
select(data, colnames(data)[grepl("search_string",colnames(data))])
Ninguno de los dos funciona.
Sé que select()
acepta vectores numéricos como sustituto de columnas, por ejemplo:
select(data,5,7,9:20)
Pero no sé cómo obtener un vector numérico de columnas ID
a partir de mi grepl()
expresión.
Respuestas:
Dentro del mundo dplyr , intente:
select(iris,contains("Sepal"))
Consulte la sección Selección de
?select
para numerosos otros ayudantes les gustastarts_with
,ends_with
etc.fuente
select(iris, contains(".") )
No estoy seguro de cómo se supone que debe pasarfixed=TRUE
para forzar la búsqueda de un real"."
fixed = TRUE
o el equivalente). dplyr es todavía bastante joven.Puedes probar:
select(data, matches("search_string"))
Es más general que
contains
: puede usar expresiones regulares (por ejemplo"one_string|or_the_other"
).Para obtener más ejemplos, consulte: http://rpackages.ianhowson.com/cran/dplyr/man/select.html .
fuente
No es necesario usar
select
solo usar[
en su lugardata[,grepl("search_string", colnames(data))]
Probemos con el
iris
conjunto de datos>iris[,grepl("Sepal", colnames(iris))] Sepal.Length Sepal.Width 1 5.1 3.5 2 4.9 3.0 3 4.7 3.2 4 4.6 3.1 5 5.0 3.6 6 5.4 3.9
fuente
dplyr
es un panceum, incluso cuando puede hacerlobase
, la sintaxis estándar no es tan agradable / legible / componible: vea mi respuesta .Según la respuesta de Piotr Migdals, quiero ofrecer una solución alternativa que permita la posibilidad de un vector de cadenas:
myVectorOfStrings <- c("foo", "bar") matchExpression <- paste(myVectorOfStrings, collapse = "|") # [1] "foo|bar" df %>% select(matches(matchExpression))
Haciendo uso del
OR
operador regex (|
)ATENCIÓN : Si realmente tiene un vector simple de nombres de columna (y no necesita el poder de RegExpression), consulte el comentario debajo de esta respuesta (ya que es la solución más limpia).
fuente
select(df, one_of(array_of_colnames))