teoria subconjuntos relaciones potencia operaciones matematicas entre ejemplos discretas conjuntos conjunto r subset

subconjuntos - teoria de conjuntos ejemplos



Los datos del subconjunto solo contienen columnas cuyos nombres coinciden con una condiciĆ³n (4)

¿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 marco de datos final.


Esto funcionó para mí:

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


Pruebe grepl en los nombres de su data.frame . grepl coincide con una expresión regular a un objetivo 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)))