Usando python he creado la siguiente estructura de datos que contiene valores de similaridad:

  cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture    jaccard
1       0.770     0.489        0.388  0.57500000 0.5845137    0.3920000 0.00000000
2       0.067     0.496        0.912  0.13865546 0.6147309    0.6984127 0.00000000
3       0.514     0.426        0.692  0.36440678 0.4787535    0.5198413 0.05882353
4       0.102     0.430        0.739  0.11297071 0.5288008    0.5436508 0.00000000
5       0.560     0.735        0.554  0.48148148 0.8168083    0.4603175 0.00000000
6       0.029     0.302        0.558  0.08547009 0.3928234    0.4603175 0.00000000

Estoy tratando de escribir una secuencia de comandos de R para generar otro marco de datos que refleja las papeleras, pero mi condición de agrupamiento se aplica si el valor es superior a 0,5 tal que

Pseudocódigo:

if (cosinFcolor > 0.5 & cosinFcolor <= 0.6)
   bin = 1
if (cosinFcolor > 0.6 & cosinFcolor <= 0.7)
   bin = 2
if (cosinFcolor > 0.7 & cosinFcolor =< 0.8)
   bin = 3
if (cosinFcolor > 0.8 & cosinFcolor <=0.9)
   bin = 4
if (cosinFcolor > 0.9 & cosinFcolor <= 1.0)
   bin = 5
else
   bin = 0

Basado en la lógica anterior, quiero construir un marco de datos

  cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture    jaccard
1       3         0         0            1           1        0               0

¿Cómo puedo empezar esto como una secuencia de comandos, o que debo hacer esto en python? Estoy tratando de familiarizarse con R después de averiguar cómo de potente es/número de la máquina de aprendizaje de los paquetes que tiene.
Mi objetivo es construir un clasificador pero primero tengo que estar familiarizado con R 🙂

  • Eche un vistazo a ?findInterval o cut
  • Para quienes se abren a un data.table enfoque, escribí un flexible bin_data() el método que he descrito en esta respuesta.
  • Se parece a la que desea aplicar el mismo exacto bandejas para todos 7 columnas, no sólo cosinFcolor

4 Comentarios

  1. 56

    Otro corte de respuesta que tenga en cuenta extrema:

    dat <- read.table("clipboard", header=TRUE)
    
    cuts <- apply(dat, 2, cut, c(-Inf,seq(0.5, 1, 0.1), Inf), labels=0:6)
    cuts[cuts=="6"] <- "0"
    cuts <- as.data.frame(cuts)
    
      cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture jaccard
    1           3         0            0           1         1            0       0
    2           0         0            5           0         2            2       0
    3           1         0            2           0         0            1       0
    4           0         0            3           0         1            1       0
    5           1         3            1           0         4            0       0
    6           0         0            1           0         0            0       0

    Explicación

    El corte de la función se divide en compartimientos dependiendo de los recortes que usted especifique. Así que vamos a tomar de 1:10, que se dividió en 3, 5 y 7.

    cut(1:10, c(3, 5, 7))
     [1] <NA>  <NA>  <NA>  (3,5] (3,5] (5,7] (5,7] <NA>  <NA>  <NA> 
    Levels: (3,5] (5,7]

    Se puede ver cómo se ha efectuado un factor donde los niveles son aquellos entre los descansos. También aviso que no incluyen 3 (hay un include.lowest argumento de que va a incluir). Pero estos son terribles nombres de los grupos, vamos a llamarlos grupo 1 y 2.

    cut(1:10, c(3, 5, 7), labels=1:2)
     [1] <NA> <NA> <NA> 1    1    2    2    <NA> <NA> <NA>

    Mejor, pero ¿qué pasa con el NAs? Ellos están fuera de nuestras fronteras y no se cuentan. Contar, en mi solución, he añadido el infinito y el infinito, de modo que todos los puntos deben incluirse. Observe que a medida que tenemos más descansos, vamos a necesitar más etiquetas:

    x <- cut(1:10, c(-Inf, 3, 5, 7, Inf), labels=1:4)
     [1] 1 1 1 2 2 3 3 4 4 4
    Levels: 1 2 3 4

    Ok, pero no queremos que 4 (según su problema). Queríamos que todos los 4s para estar en el grupo 1. Así que vamos a deshacernos de las entradas que están etiquetados ‘4’.

    x[x=="4"] <- "1"
     [1] 1 1 1 2 2 3 3 1 1 1
    Levels: 1 2 3 4

    Esto es un poco diferente a lo que hice antes, aviso quité toda la última de las etiquetas en la final antes, pero he hecho de esta manera para que puedan ver mejor cómo cut obras.

    Aceptar, el apply función. Hasta ahora, hemos estado utilizando cortan en un único vector. Pero usted desea que se utilicen en una colección de vectores: cada columna del marco de datos. Eso es lo que el segundo argumento de apply hace. 1 se aplica a la función para todas las filas, 2 se aplica a todas las columnas. Aplicar el cut la función a cada columna del marco de datos. Todo después de cut en la aplicación de la función son sólo argumentos para cut, que hemos discutido anteriormente.

    Espero que ayude.

    • Esta es la respuesta exacta que yo estaba buscando, gracias
    • Cualquier posibilidad de que usted podría explicar las cosas que está haciendo, me encantaría recibir la lógica de todo y aprender de ella en lugar de simplemente afrontar la misma.
    • Se agrega una explicación.
    • Lo que si me los cubos no siguen una secuencia precisa? ¿Y si estos son personalizados cubos dentro de otro dataframe?
    • La secuencia fue así por ejemplo. En mi explicación, verás que he utilizado personalizado divisiones.
  2. 25

    También puede utilizar findInterval:

    findInterval(seq(0, 1, l=20), seq(0.5, 1, by=0.1))
    
    ## [1] 0 0 0 0 0 0 0 0 0 1 1 2 2 3 4 4 5 5
    • Sí. Una función muy útil. Permite evitar la creación de desordenado de los factores de corte().
    • Usted no tiene que tener un poco de desorden factor con el corte. Puede configurar las etiquetas = False para obtener entero códigos en lugar de factores, pero sin sacrificar la flexibilidad que cortar() le permite a usted.
  3. 14

    Con corte es tan fácil como el pastel de

    dtf <- read.table(
    textConnection(
    "cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture jaccard
    1 0.770 0.489 0.388 0.57500000 0.5845137 0.3920000 0.00000000
    2 0.067 0.496 0.912 0.13865546 0.6147309 0.6984127 0.00000000
    3 0.514 0.426 0.692 0.36440678 0.4787535 0.5198413 0.05882353
    4 0.102 0.430 0.739 0.11297071 0.5288008 0.5436508 0.00000000
    5 0.560 0.735 0.554 0.48148148 0.8168083 0.4603175 0.00000000
    6 0.029 0.302 0.558 0.08547009 0.3928234 0.4603175 0.00000000"), sep = " ", 
               header = TRUE)
    
    dtf$bin <- cut(dtf$cosinFcolor, breaks = c(0, seq(0.5, 1, by = .1)), labels = 0:5)
    dtf
      cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture    jaccard bin
    1       0.770     0.489        0.388  0.57500000 0.5845137    0.3920000 0.00000000   3
    2       0.067     0.496        0.912  0.13865546 0.6147309    0.6984127 0.00000000   0
    3       0.514     0.426        0.692  0.36440678 0.4787535    0.5198413 0.05882353   1
    4       0.102     0.430        0.739  0.11297071 0.5288008    0.5436508 0.00000000   0
    5       0.560     0.735        0.554  0.48148148 0.8168083    0.4603175 0.00000000   1
    6       0.029     0.302        0.558  0.08547009 0.3928234    0.4603175 0.00000000   0
  4. 2

    Aquí otra solución mediante la bin_data() función de la mltools paquete.

    Binning un vector

    library(mltools)
    
    cosinFcolor <- c(0.77, 0.067, 0.514, 0.102, 0.56, 0.029)
    binned <- bin_data(cosinFcolor, bins=c(0, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0), boundaryType = "[lorc")
    
    binned
    [1] (0.7, 0.8] [0, 0.5]   (0.5, 0.6] [0, 0.5]   (0.5, 0.6] [0, 0.5]  
    Levels: [0, 0.5] < (0.5, 0.6] < (0.6, 0.7] < (0.7, 0.8] < (0.8, 0.9] < (0.9, 1]
    
    # Convert to numbers 0, 1, ...
    as.integer(binned) - 1L

    Binning cada columna de los datos.marco

    df <- read.table(textConnection(
      "cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture jaccard
    0.770 0.489 0.388 0.57500000 0.5845137 0.3920000 0.00000000
    0.067 0.496 0.912 0.13865546 0.6147309 0.6984127 0.00000000
    0.514 0.426 0.692 0.36440678 0.4787535 0.5198413 0.05882353
    0.102 0.430 0.739 0.11297071 0.5288008 0.5436508 0.00000000
    0.560 0.735 0.554 0.48148148 0.8168083 0.4603175 0.00000000
    0.029 0.302 0.558 0.08547009 0.3928234 0.4603175 0.00000000"
    ), sep = " ", header = TRUE)
    
    for(col in colnames(df)) df[[col]] <- as.integer(bin_data(df[[col]], bins=c(0, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0), boundaryType = "[lorc")) - 1L
    
    df
      cosinFcolor cosinEdge cosinTexture histoFcolor histoEdge histoTexture jaccard
    1           3         0            0           1         1            0       0
    2           0         0            5           0         2            2       0
    3           1         0            2           0         0            1       0
    4           0         0            3           0         1            1       0
    5           1         3            1           0         4            0       0
    6           0         0            1           0         0            0       0
    • es el [lorc una matriz de indicador? de qué tipo?
    • «lorc» significa «izquierda-abierto-cerrado», que indica el límite del tipo de cada bin. El «[» en el extremo izquierdo, significa «hacer la izquierda de la mayoría de reciclaje de izquierda cerrada». Ver ?bin_data para citar algunos ejemplos.
    • thx. es allí una manera de decir sólo para un determinado dataframe: reciclaje cada columna de valores numéricos en K papeleras? (tal vez debería pedir a este como un solo pregunta..)
    • ¿Te refieres a como esta? df <- iris[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")]; bin_data(unlist(df), bins = 5)
    • eso es impresionante!

Dejar respuesta

Please enter your comment!
Please enter your name here