Los datos del subconjunto solo contienen columnas cuyos nombres coinciden con una condición

¿Hay alguna forma de subconjunto de datos en base a nombres de columna que comiencen con una cadena en particular? Tengo algunas columnas que son como ABC_1 ABC_2 ABC_3 y algunas como XYZ_1, XYZ_2,XYZ_3 digamos.

¿Cómo puedo subconjuntar mi df basado solo en columnas que contienen las partes de texto anteriores (digamos, ABC o XYZ )? Puedo usar índices, pero las columnas están demasiado dispersas en datos y se vuelve demasiado difícil de codificar.

Además, solo quiero incluir filas de cada una de estas columnas donde cualquiera de sus valores sea >0 por lo que si cualquiera de las 6 columnas anteriores tiene un 1 en la fila, se corta en mi dataframe final.

Pruebe grepl en los nombres de su data.frame . grepl coincide con una expresión regular a un objective y devuelve TRUE si se encuentra una coincidencia y FALSE contrario. La función está vectorizada para que pueda pasar un vector de cadenas para que coincida y obtendrá un vector de valores booleanos devueltos.

Ejemplo

 # Data df <- data.frame( ABC_1 = runif(3), ABC_2 = runif(3), XYZ_1 = runif(3), XYZ_2 = runif(3) ) # ABC_1 ABC_2 XYZ_1 XYZ_2 #1 0.3792645 0.3614199 0.9793573 0.7139381 #2 0.1313246 0.9746691 0.7276705 0.0126057 #3 0.7282680 0.6518444 0.9531389 0.9673290 # Use grepl df[ , grepl( "ABC" , names( df ) ) ] # ABC_1 ABC_2 #1 0.3792645 0.3614199 #2 0.1313246 0.9746691 #3 0.7282680 0.6518444 # grepl returns logical vector like this which is what we use to subset columns grepl( "ABC" , names( df ) ) #[1] TRUE TRUE FALSE FALSE 

Para responder a la segunda parte, haría el subconjunto data.frame y luego crearía un vector que indexe las filas para mantener (un vector lógico) como este ...

 set.seed(1) df <- data.frame( ABC_1 = sample(0:1,3,repl = TRUE), ABC_2 = sample(0:1,3,repl = TRUE), XYZ_1 = sample(0:1,3,repl = TRUE), XYZ_2 = sample(0:1,3,repl = TRUE) ) # We will want to discard the second row because 'all' ABC values are 0: # ABC_1 ABC_2 XYZ_1 XYZ_2 #1 0 1 1 0 #2 0 0 1 0 #3 1 1 1 0 df1 <- df[ , grepl( "ABC" , names( df ) ) ] ind <- apply( df1 , 1 , function(x) any( x > 0 ) ) df1[ ind , ] # ABC_1 ABC_2 #1 0 1 #3 1 1 

También puede usar starts_with y dplyr ‘s select() manera:

 df <- df %>% dplyr:: select(starts_with("ABC")) 

Usando dplyr puedes:

 df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df))) 

Esto funcionó para mí:

 df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]