
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora. tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75)))) O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro: "Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer? Um abraço, Carlos Mendonça.

vc precisa checar os 'bins' usados em cut(). O que o erro sugere e' que vc tem dois limites identicos em bins... Por exemplo: set.seed(1) grps = c(0, .2, .2, .4, 1) cut(runif(10), grps) e ele funcionaria se: set.seed(1) grps = c(0, .2, .4, 1) cut(runif(10), grps) Ou seja, em teoria, vc precisaria usar: cut(coord, unique(bins), labels=FALSE, include.lowest=T) Entretanto, ao usar unique() vc vai obter uma resposta de comprimento diferente dos outros nos quais 'bins' assume valores diferentes. Consequentemente o seu do.call(rbind, ...) vai falhar. Vc precisa, portanto, checar se 'bins' eh duplicado, fazer o cut() nos valores unicos, determinar sua media e, depois, reconstruir a resposta (ie. colocar de volta o valor duplicado com a media correspondente) para que fique com o comprimento correto. b

Benilton, você poderia me ajudar, pois com o meu nível de conhecimento do R eu não consegui implementar a sua solução de "checar se 'bins' eh duplicado, fazer o cut() nos valores unicos, determinar sua media e, depois, reconstruir a resposta (ie. colocar de volta o valor duplicado com a media correspondente) para que fique com o comprimento correto.". Obrigado, Carlos Mendonça. Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço, Mendonça

eu sei que fui eu quem escreveu a funcao... mas eu jah nao sei o contexto, nem o exemplo (reproduzivel) de dados a ser empregado... a sugestao eh conforme o email anterior: modifique seu codigo de forma a ter: cut(coord, unique(bins), labels=FALSE, include.lowest=T) ao inves de: cut(coord, bins, labels=FALSE, include.lowest=T) uma vez q fizer essa modificacao, vc *nao* deve usar: do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75)))) mas apenas lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))) pois os resultados ja nao terao mais o mesmo comprimento. b

Olá Benilton, usei aux1 <- lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))) Porém, deu o erro abaixo. "Erro em split.default(seq_len(nrow(x)), f, drop = drop, ...) : Comprimento do grupo é zero mas o comprimento dos dados é maior que zero" Será que tem que fazer mais alguma coisa? Obrigado pela ajuda, Carlos Mendonça. Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço, Mendonça

Benilton, estou disponibilizando o código e o data que eu utilizo. Agradeço muito a sua ajuda. http://www.datafilehost.com/download-91695640.html http://www.datafilehost.com/download-8501f2b5.html Carlos Mendonça. Em 20 de setembro de 2011 21:10, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Olá Benilton,
usei
aux1 <- lapply(split(tmp, tmp$codigo),
function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))) Porém, deu o erro abaixo. "Erro em split.default(seq_len(nrow(x)), f, drop = drop, ...) : Comprimento do grupo é zero mas o comprimento dos dados é maior que zero"
Será que tem que fazer mais alguma coisa?
Obrigado pela ajuda,
Carlos Mendonça.
Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço,
Mendonça
-- Um abraço, Mendonça

No seu caso, o problema eh outro. Voce precisa fazer um controle de qualidade no seu conjunto de dados. Primeiro, ha' varias instancias de #VALOR! no arquivo que vc passou. Depois, ao criar 'univ', vc mistura diversos anos/meses... o que causa duplicacao significativa... que, por consequencia, gera o problema q vc observou. Se vc vai ignorar anos/meses, imagino que a varianvel 'pond' deva ser criada depois de agrupar esses valores. E, por fim, (nao necessariamente um problema, mas confirme que eh isso que vc quer fazer): vc quer os quantis de "pond" ponderados por "val"? b

Benilton, eu postei um novo código corrigindo o problema do #VALOR e gerando univ sem a informação do ano e mes. http://www.datafilehost.com/download-b19057ee.html Eu preciso calcular, por codigo, o quartil da variável pond ponderado pelo val. Obrigado, Carlos Mendonça. Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço, Mendonça

Como eu tentei explicar na mensagem anterior, voce precisa pegar o data.frame "entra" e agrupar todas as observacoes por codigo (use aggregate) e soh depois disso determine "pond". (seu codigo nao eh reproduzivel - a variavel qtd nao existe... experimente com o conjunto de dados disponivel no link q vc passou anteriormente) Use algo como (eu nao espero que o codigo abaixo esteja completamente correto - na verdade, eu prevejo que os resultados estarao incorretos, pois vc precisa ver como os dados de anos/meses diferentes devem ser combinados): entra = read.csv2("~/Downloads/Arquivo 1.csv", dec = ",", stringsAsFactors=FALSE) entra$peso = as.numeric(gsub("\\,", "\\.", entra$peso)) combinado = with(entra, aggregate(list(peso=peso, val=val), by=list(codigo=codigo), sum)) combinado$pond = combinado$val/combinado$peso tmp = combinado[, c('codigo', 'pond', 'val')] ## aqui executar o do.call(rbind, lapply.....) b

Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço, Mendonça

Benilton, vou tentar explicar melhor o que eu preciso. Eu tenho um arquivo com as variáveis codigo, peso, val, pond, mes e ano. Esse arquivo de +/- 1.500.000 observações, tem *n* observações para cada código por mês e ano. Na minha rotina eu esqueço a informação do mês, pois eu quero essa rotina por ano. Eu preciso calcular os quartis (1º e 3º) por código da variável pond ponderados pela variável val. Em seguida preciso calcular a diferença interquartílica e os limites (superior e inferior) com os resultados dos quartis. Depois, junto esse arquivo com os limites com o arquivo com todas as informações e retiro dele as observações cujo pond não esteja entre os limites. Executo essa rotina 2 vezes. Estou mandando os novos links com o código e os dados. http://www.datafilehost.com/download-7fe849b1.html http://www.datafilehost.com/download-0437cad6.html Em 22 de setembro de 2011 10:51, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço,
Mendonça
-- Um abraço, Mendonça

E eu vou explicar novamente... vc precisa agregar os dados apropriadamente antes de executar equantilesByCounts(). O seu arquivo, originalmente, tem codigo, peso, val, mes e ano. Se vc vai ignorar mes/ano (ou qq combinacao deles), vc precisa agregar os dados de peso e val para, so' depois, determinar pond. Depois de feito isso, a funcao que escrevi para vc funcionara' como esperado. b

Benilton, desculpe o trabalho, eu já havia entendido o que você sugeriu, mas eu não posso agregar os dados por código, pois assim, eu teria para cada código o valor do 1º e 3º quartis identicos, bem como, os limites (superior e inferior). Eu preciso que faça o cálculo dos quartis utilizando todos os valores da variável pond de cada código. Na verdade, o código inicial funcionou para um ano, mas quando eu executei um outro ano, ele me apresentou aquela mensagem de erro que eu listei no 1º post, ou seja, "Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Obrigado, Carlos Mendonça. E eu vou explicar novamente... vc precisa agregar os dados apropriadamente antes de executar equantilesByCounts(). O seu arquivo, originalmente, tem codigo, peso, val, mes e ano. Se vc vai ignorar mes/ano (ou qq combinacao deles), vc precisa agregar os dados de peso e val para, so' depois, determinar pond. Depois de feito isso, a funcao que escrevi para vc funcionara' como esperado. Em 23 de setembro de 2011 07:03, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Benilton, vou tentar explicar melhor o que eu preciso. Eu tenho um arquivo com as variáveis codigo, peso, val, pond, mes e ano. Esse arquivo de +/- 1.500.000 observações, tem *n* observações para cada código por mês e ano. Na minha rotina eu esqueço a informação do mês, pois eu quero essa rotina por ano. Eu preciso calcular os quartis (1º e 3º) por código da variável pond ponderados pela variável val. Em seguida preciso calcular a diferença interquartílica e os limites (superior e inferior) com os resultados dos quartis. Depois, junto esse arquivo com os limites com o arquivo com todas as informações e retiro dele as observações cujo pond não esteja entre os limites. Executo essa rotina 2 vezes. Estou mandando os novos links com o código e os dados. http://www.datafilehost.com/download-7fe849b1.html
http://www.datafilehost.com/download-0437cad6.html
Em 22 de setembro de 2011 10:51, Carlos Mendonça <csaeslpv@centroin.com.br
escreveu:
Em 31 de agosto de 2011 09:30, Carlos Mendonça <csaeslpv@centroin.com.br>escreveu:
Caros, estou utilizando a função abaixo que calcula os quartis ponderados que funcionou muito bem até agora.
tmp = subset(arq1, select=c(codigo, qtd, val)) equantileByCounts <- function(x, counts, qs){ tot <- sum(counts) i <- order(x) x <- x[i] counts <- counts[i] partial <- cumsum(counts) qsObs <- qs*tot start <- floor(qsObs) end <- ceiling(qsObs) i <- length(qs) aux1 <- sapply(1:i, function(.x, start, end, x){ coord <- c(start[.x], end[.x]) bins <- c(1, partial) grps <- cut(coord, bins, labels=FALSE, include.lowest=T) mean(x[grps]) }, start=start, end=end, x=x) names(aux1) <- names(qs) return(aux1) } aux1 <- do.call(rbind, lapply(split(tmp, tmp$codigo), function(y) equantileByCounts(y$qtd, y$val, c(.25, .75))))
O meu processamento é por trimestres e em apenas um deles deu a seguinte mensagem de erro:
"Erro em cut.default(coord, bins, labels = FALSE, include.lowest = T) : 'breaks' não são únicos" Alguém saberia me dizer o que posso fazer?
Um abraço,
Carlos Mendonça.
-- Um abraço,
Mendonça
-- Um abraço,
Mendonça
-- Um abraço, Mendonça

A melhor solucao eh vc selecionar as obs do codigo 50575000 e fazer manualmente... pegue a sua variavel 'entra', selecione apenas o codigo acima e veja o q acontece.... dai' e' mais simples vc consertar a funcao para o q vc quer. https://gist.github.com/1237671 b
participantes (2)
-
Benilton Carvalho
-
Carlos Mendonça