Necesito un subconjunto df para incluir ciertas cadenas. Algunos de estos están llenos de nombres de columnas, y el siguiente funciona bien:

testData[,c("FullColName1","FullColName2","FullColName3")]

Mi problema es que necesito ampliar esta para incluir también los nombres de columna que contienen cadenas específicas que pueden parcialmente con algunos otros nombres de columna. Estas cadenas incluir letras y símbolos:

"PartString1()","PartString2()"

He intentado poner comodines en torno a estos. (He indicado aquí abajo con el prefijo «estrella» porque el símbolo»*», no hacen correctamente).

testData[ ,c("FullColName1","FullColName2","FullColName3",
             "starPartString1()star","starPartString2()star")]

Pero estoy recibiendo un mensaje de error: undefined columnas seleccionadas. Yo no puedo averiguar si es o cómo necesito grep para hacer este trabajo.

  • ¿Qué es «PartString1()»? Los pares de paréntesis me hacen pensar que usted está utilizando una función. NO es válido R nombre. Prueba a poner en el código que construye lo que usted está trabajando.
  • «PartString1()» es el nombre de una variable. Yo estaba tratando de usar grep coincidencia parcial de los nombres de columna que incluye específicos char cuerdas y un conjunto de paréntesis. Problema resuelto con df2<-df1[, grepl(«FullColName1|FullColName2|FullColName3|PartSting1[[:punct:]]|PartString2[[:punct:]]»,names(df1))]
InformationsquelleAutor user3614783 | 2014-06-12

3 Comentarios

  1. 15

    Que usted ha mencionado usted puede estar buscando símbolos, así que para este ejemplo en particular podemos utilizar [[:punct:]] como nuestra expresión regular. Esta va a encontrar todas las cadenas, con signos de puntuación en los nombres de columna.

    d <- data.frame(1:3, 3:1, 11:13, 13:11, rep(1, 3))
    names(d) <- c("FullColName1", "FullColName2", "FullColName3",
                  "PartString1()","PartString2()")
    
    d[grepl("[[:punct:]]", names(d))]
    #   PartString1() PartString2()
    # 1            13             1
    # 2            12             1
    # 3            11             1

    Esta última parte sólo ilustra otra forma de hacer esto con otra cadena de funciones de procesamiento de stringr

    library(stringr)
    d[str_detect(names(d), "[[:punct:]]")]
    #   PartString1() PartString2()
    # 1            13             1
    # 2            12             1
    # 3            11             1

    AGREGAR por OPs comentario

    d[grepl("ring[12()]", names(d))]

    para conseguir cualquiera de las subcadenas ring1() o ring2() a partir de los nombres de vectores

    • Muchas gracias Richard. Yo no sabía acerca de [[:punct:]]. Esta casi soluciona mi problema, pero tengo que seleccionar todas las columnas que tienen la subcadena ring1() o la subcadena ring2(). Sólo la búsqueda de signos de puntuación, es demasiado amplio.
    • Eso sería d[, grepl("ring[12()]", names(d))]. Usted me gustaria cambiar eso en mi respuesta?
    • Yo me vine con d[, grep(«ring1[[:punct:]]|ring2[[:punct:]]»,nombres(d))], pero el tuyo es más elegante. Gracias de nuevo.
  2. 9

    Puede utilizar grep para encontrar los índices de los nombres de columna con coincidencia parcial a un patrón particular

    require(PerformanceAnalytics)
    data(managers)
    
    colnames(managers)
    #[1] "HAM1"        "HAM2"        "HAM3"        "HAM4"        "HAM5"       
    #[6] "HAM6"        "EDHEC LS EQ" "SP500 TR"    "US 10Y TR"   "US 3m TR"

    supongamos que el patrón que desea partido es «JAMÓN«, junto con algunos fijos nombres de columna («SP500 TR» «NOSOTROS 10 AÑOS TR» «NOS 3m TR»)

    head(managers[,c("SP500 TR","US 10Y TR","US 3m TR",colnames(managers)[grep("HAM",colnames(managers))])])
    #           SP500 TR US 10Y TR US 3m TR    HAM1 HAM2    HAM3    HAM4 HAM5 HAM6
    #1996-01-31   0.0340   0.00380  0.00456  0.0074   NA  0.0349  0.0222   NA   NA
    #1996-02-29   0.0093  -0.03532  0.00398  0.0193   NA  0.0351  0.0195   NA   NA
    #1996-03-31   0.0096  -0.01057  0.00371  0.0155   NA  0.0258 -0.0098   NA   NA
    #1996-04-30   0.0147  -0.01739  0.00428 -0.0091   NA  0.0449  0.0236   NA   NA
    #1996-05-31   0.0258  -0.00543  0.00443  0.0076   NA  0.0353  0.0028   NA   NA
    #1996-06-30   0.0038   0.01507  0.00412 -0.0039   NA -0.0303 -0.0019   NA   NA

    puede especificar varios patrones de uso, grep("pattern1 | pattern2 ", colnames(data))

    • gracias por mostrarme tu múltiples patrón de ejemplo. Me estaba poniendo cada uno de los patrones en las cotizaciones, en lugar de poner comillas alrededor de todo el conjunto de patrones.
    • En mi solicitud, yo tenía que escribir grep("pattern1|pattern2 ", colnames(data)), sin un espacio cualquiera de los lados de |
  3. 3

    Puede utilizar grepl para una búsqueda por el nombre de la columna. Devuelve un vector lógico que indica partidos.

    Aquí está un ejemplo:

    d <- read.table(header=TRUE, check.names=FALSE,
                    text="1PartString()2 1PartString()3 OtherCol
                    1 2 3
                    3 4 5")
    d
    ##   1PartString()2 1PartString()3 OtherCol
    ## 1              1              2        3
    ## 2              3              4        5
    
    d[,grepl("PartString\(\)", names(d))]
    ##   1PartString()2 1PartString()3
    ## 1              1              2
    ## 2              3              4

    grepl comprobar para ver si el patrón está presente en cualquier parte del nombre, por lo que un comodín no es necesario.

    • O, simplemente, utilizar patt=»PartString». La idea de poner los pares de paréntesis en dataframe nombres de columna me parece mal.

Dejar respuesta

Please enter your comment!
Please enter your name here