visualizar mtcars functions espaƱol ejemplos data crear column r dataframe

functions - r data frame mtcars



Generar contenedores desde un marco de datos (4)

Usando python, he creado el siguiente marco de datos que contiene valores de similitud:

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

Intento escribir un guión R para generar otro marco de datos que refleje los contenedores, pero mi condición de binning 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 comenzar esto como un script, o debería hacerlo en Python? Estoy tratando de familiarizarme con R después de descubrir qué tan poderoso es / cantidad de paquetes de aprendizaje automático que tiene. Mi objetivo es construir un clasificador, pero primero necesito estar familiarizado con R :)


Aquí hay otra solución que usa la función bin_data() del paquete mltools .

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

Intercalando cada columna en el data.frame

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


Con corte es fácil como un pastel

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


Otra respuesta de corte que toma en cuenta los extremos:

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

La función de corte se divide en contenedores dependiendo de los cortes que especifique. Así que tomemos 1:10 y dividirlo 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]

Puedes ver cómo se ha convertido en un factor en el que los niveles son los intermedios entre los descansos. También note que no incluye 3 (hay un argumento include.lowest que lo incluirá). Pero estos son nombres terribles para los grupos, llamémoslos 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 las NA? Están fuera de nuestros límites y no cuentan. Para contarlos, en mi solución, agregué infinito e infinito, por lo que se incluirían todos los puntos. Tenga en cuenta que a medida que tengamos más descansos, necesitaremos 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 queríamos 4 (según su problema). Queríamos que todos los 4 estuvieran en el grupo 1. Así que eliminemos las entradas que están etiquetadas como ''4''.

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

Esto es ligeramente diferente a lo que hice antes, noté que me quité todas las etiquetas anteriores al final, pero lo hice de esta manera aquí para que pueda ver mejor cómo funciona el cut .

Ok, la función de apply . Hasta ahora, hemos estado usando cortar en un solo vector. Pero desea que se use en una colección de vectores: cada columna de su marco de datos. Eso es lo que hace el segundo argumento de apply . 1 aplica la función a todas las filas, 2 aplica a todas las columnas. Aplique la función de cut a cada columna de su marco de datos. Todo después del cut en la función aplicar son solo argumentos para cut , que hemos discutido anteriormente.

Espero que ayude.


También puede usar 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