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