Gerar checkboxs de um quadro de dados

Usando o python, criei o seguinte quadro de dados que contém valores de similaridade:

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 

Estou tentando escrever um script R para gerar outro quadro de dados que reflita os escaninhos, mas minha condição de escaneamento se aplica se o valor estiver acima de 0,5, tal que

Pseudo-código:

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

Com base na lógica acima, eu quero construir um quadro de dados

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

Como posso começar isso como um script ou devo fazer isso em python? Eu estou tentando me familiarizar com o R depois de descobrir o quão poderoso ele é / número de pacotes de aprendizado de máquina que ele possui. Meu objective é construir um classificador, mas primeiro eu preciso estar familiarizado com R 🙂

Outra resposta cortada que leva em consideração os 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 

Explicação

A function de corte se divide em checkboxs, dependendo dos cortes especificados. Então, vamos pegar 1:10 e dividir em 3, 5 e 7.

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

Você pode ver como isso fez um fator onde os níveis são aqueles entre os intervalos. Observe também que não inclui 3 (há um argumento include.lowest que o includeá). Mas esses são nomes terríveis para grupos, vamos chamá-los de grupo 1 e 2.

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

Melhor, mas o que há com os NAs? Eles estão fora dos nossos limites e não são contados. Para contá-los, na minha solução, adicionei -infinity e infinito, para que todos os pontos fossem incluídos. Observe que, como temos mais pausas, precisaremos de mais marcadores:

 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, mas nós não queremos 4 (como por seu problema). Nós queríamos que todos os 4s estivessem no grupo 1. Então vamos nos livrar das inputs que estão rotuladas como '4'.

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

Isso é um pouco diferente do que eu fiz antes, percebo que tirei todas as últimas etiquetas no final antes, mas eu fiz desta forma aqui para que você possa ver melhor como funciona o cut .

Ok, a function de apply . Até agora, usamos o corte em um único vetor. Mas você quer que seja usado em uma coleção de vetores: cada coluna do seu quadro de dados. É o que o segundo argumento de apply faz. 1 aplica a function a todas as linhas, 2 se aplica a todas as colunas. Aplique a function de cut a cada coluna do seu quadro de dados. Tudo após o cut na function apply são apenas argumentos para cut , que discutimos acima.

Espero que ajude.

Você também pode usar o 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 

Com o corte é fácil como torta

 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 

Aqui está outra solução usando a function bin_data() do pacote mltools .

Binning um vetor

 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 coluna no 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