Ticktest - Código lento

Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil. Grato, Luciano Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK. Um exemplo dos dados: Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK _*O CÓDIGO EM SI:*_ *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x)))) *# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" } *# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#*Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#*Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#*Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }

abaixo, nao testado, deve estar bem proximo do q vc precisa. b loop 1: y[,4] = ifelse(y[,2] == 10, 'NC', 'C') loop 2: n = nrow(y) y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4]) loop 3: dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4]) 2011/6/20 Luciano Ramos Gonçalves <lrg.financas@gmail.com>
** Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil.
Grato, Luciano
Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK.
Um exemplo dos dados:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK *O CÓDIGO EM SI:* *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x))))
*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" }
*# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#* Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#* Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

Fiz uns testes e realmente ficou muito mais rápido. Apenas três problemas apareceram, todos com a mesma provável resolução. No loop 2: O primeiro negócio não é classificado, e os próximos, digamos, 6, mantém o mesmo preço, logo, todos estes deveriam ser não classificados. O código apenas desclassifica o subsequente. Para que estivesse ok, teria que ser repetido. No loop 3: Acontece algo semelhante. Se havia um Zero.DOWNTICK, e o próximo negócio também não mudou este tb deveria ser ZERO.DOWNTICK, mas o código está mantendo "C". Grato, Luciano. Em 6/20/2011 5:34 PM, Benilton Carvalho escreveu:
abaixo, nao testado, deve estar bem proximo do q vc precisa. b
loop 1:
y[,4] = ifelse(y[,2] == 10, 'NC', 'C')
loop 2:
n = nrow(y) y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4])
loop 3:
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
2011/6/20 Luciano Ramos Gonçalves <lrg.financas@gmail.com <mailto:lrg.financas@gmail.com>>
Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil.
Grato, Luciano
Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK.
Um exemplo dos dados:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK
_*O CÓDIGO EM SI:*_ *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x))))
*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" }
*# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#*Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#*Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#*Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

os sinais nos diffs pro loop 3 estavam invertidos (essa era a parte do 'nao-testado'): dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4]) adicionalmente, os resultados que agora passo batem com aqueles providos pelo seu codigo original. sobre o primeiro item nao ser classificado no loop 2, e' um reflexo do que o seu codigo faz, pois ele comeca a classificar em y[i+1,4] com 'i' comecando em 1... b 2011/6/21 Luciano Ramos Gonçalves <lrg.financas@gmail.com>
** Fiz uns testes e realmente ficou muito mais rápido. Apenas três problemas apareceram, todos com a mesma provável resolução. No loop 2: O primeiro negócio não é classificado, e os próximos, digamos, 6, mantém o mesmo preço, logo, todos estes deveriam ser não classificados. O código apenas desclassifica o subsequente. Para que estivesse ok, teria que ser repetido. No loop 3: Acontece algo semelhante. Se havia um Zero.DOWNTICK, e o próximo negócio também não mudou este tb deveria ser ZERO.DOWNTICK, mas o código está mantendo "C".
Grato,
Luciano.
Em 6/20/2011 5:34 PM, Benilton Carvalho escreveu:
abaixo, nao testado, deve estar bem proximo do q vc precisa. b
loop 1:
y[,4] = ifelse(y[,2] == 10, 'NC', 'C')
loop 2:
n = nrow(y) y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4])
loop 3:
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
2011/6/20 Luciano Ramos Gonçalves <lrg.financas@gmail.com>
Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil.
Grato, Luciano
Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK.
Um exemplo dos dados:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK *O CÓDIGO EM SI:* *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x))))
*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" }
*# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#* Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#* Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing listR-br@listas.c3sl.ufpr.brhttps://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

A correção foi acertada. Mas não era o problema que eu havia mencionado. Por exemplo: Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $10.00 NC 1/1/2011 30 $10.00 NC 1/1/2011 40 $10.00 NC 1/1/2011 50 $10.20 UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 ZERO.UPTICK 1/1/2011 80 $10.20 ZERO.UPTICK 1/1/2011 90 $10.20 ZERO.UPTICK Assim é que a seguinte sequencia deveria ser classificada, Mas o código tem dado essa resposta: Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $10.00 NC 1/1/2011 30 $10.00 C 1/1/2011 40 $10.00 C 1/1/2011 50 $10.20 UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 C 1/1/2011 80 $10.20 C 1/1/2011 90 $10.20 C O código olha apenas para o imediatamente anterior, o que atrapalha o resultado. Luciano. Em 6/20/2011 8:29 PM, Benilton Carvalho escreveu:
os sinais nos diffs pro loop 3 estavam invertidos (essa era a parte do 'nao-testado'):
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
adicionalmente, os resultados que agora passo batem com aqueles providos pelo seu codigo original.
sobre o primeiro item nao ser classificado no loop 2, e' um reflexo do que o seu codigo faz, pois ele comeca a classificar em y[i+1,4] com 'i' comecando em 1...
b
2011/6/21 Luciano Ramos Gonçalves <lrg.financas@gmail.com <mailto:lrg.financas@gmail.com>>
Fiz uns testes e realmente ficou muito mais rápido. Apenas três problemas apareceram, todos com a mesma provável resolução. No loop 2: O primeiro negócio não é classificado, e os próximos, digamos, 6, mantém o mesmo preço, logo, todos estes deveriam ser não classificados. O código apenas desclassifica o subsequente. Para que estivesse ok, teria que ser repetido. No loop 3: Acontece algo semelhante. Se havia um Zero.DOWNTICK, e o próximo negócio também não mudou este tb deveria ser ZERO.DOWNTICK, mas o código está mantendo "C".
Grato,
Luciano.
Em 6/20/2011 5:34 PM, Benilton Carvalho escreveu:
abaixo, nao testado, deve estar bem proximo do q vc precisa. b
loop 1:
y[,4] = ifelse(y[,2] == 10, 'NC', 'C')
loop 2:
n = nrow(y) y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4])
loop 3:
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
2011/6/20 Luciano Ramos Gonçalves <lrg.financas@gmail.com <mailto:lrg.financas@gmail.com>>
Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil.
Grato, Luciano
Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK.
Um exemplo dos dados:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK
_*O CÓDIGO EM SI:*_ *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x))))
*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" }
*# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#*Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#*Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#*Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Luciano, por gentileza, de uma descricao precisa e um exemplo reproduzivel do codigo ao qual vc se refere como lento para que possamos tentar ajudar. O exemplo que te dei reproduz exatamente o codigo que voce passou... mas entendo que, alem da eficiencia do codigo, vc se refere a um outro problema, que me parece poder ser resolvido com a execucao do codigo que passei em um laco while (no qual vc armazena o estado anterior da sua tabela e suspende a execucao quando voce obtiver duas tabelas identicas). Dito isso, passe-nos um exemplo detalhado das condicoes necessarias para cada caso possivel, incluindo uma tabela inicial (que possa ser preferencialmente lida sem maiores trabalhos por quem se propoe a te ajudar) e a tabela final correta, a ser obtida no fim da execucao da rotina. b 2011/6/21 Luciano Ramos Gonçalves <lrg.financas@gmail.com>
** A correção foi acertada. Mas não era o problema que eu havia mencionado. Por exemplo:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $10.00 NC 1/1/2011 30 $10.00 NC 1/1/2011 40 $10.00 NC 1/1/2011 50 $10.20 UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 ZERO.UPTICK 1/1/2011 80 $10.20 ZERO.UPTICK 1/1/2011 90 $10.20 ZERO.UPTICK Assim é que a seguinte sequencia deveria ser classificada, Mas o código tem dado essa resposta: Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $10.00 NC 1/1/2011 30 $10.00 C 1/1/2011 40 $10.00 C 1/1/2011 50 $10.20 UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 C 1/1/2011 80 $10.20 C 1/1/2011 90 $10.20 C O código olha apenas para o imediatamente anterior, o que atrapalha o resultado.
Luciano.
Em 6/20/2011 8:29 PM, Benilton Carvalho escreveu:
os sinais nos diffs pro loop 3 estavam invertidos (essa era a parte do 'nao-testado'):
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
adicionalmente, os resultados que agora passo batem com aqueles providos pelo seu codigo original.
sobre o primeiro item nao ser classificado no loop 2, e' um reflexo do que o seu codigo faz, pois ele comeca a classificar em y[i+1,4] com 'i' comecando em 1...
b
2011/6/21 Luciano Ramos Gonçalves <lrg.financas@gmail.com>
Fiz uns testes e realmente ficou muito mais rápido. Apenas três problemas apareceram, todos com a mesma provável resolução. No loop 2: O primeiro negócio não é classificado, e os próximos, digamos, 6, mantém o mesmo preço, logo, todos estes deveriam ser não classificados. O código apenas desclassifica o subsequente. Para que estivesse ok, teria que ser repetido. No loop 3: Acontece algo semelhante. Se havia um Zero.DOWNTICK, e o próximo negócio também não mudou este tb deveria ser ZERO.DOWNTICK, mas o código está mantendo "C".
Grato,
Luciano.
Em 6/20/2011 5:34 PM, Benilton Carvalho escreveu:
abaixo, nao testado, deve estar bem proximo do q vc precisa. b
loop 1:
y[,4] = ifelse(y[,2] == 10, 'NC', 'C')
loop 2:
n = nrow(y) y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4])
loop 3:
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
2011/6/20 Luciano Ramos Gonçalves <lrg.financas@gmail.com>
Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil.
Grato, Luciano
Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK.
Um exemplo dos dados:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK *O CÓDIGO EM SI:* *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x))))
*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" }
*# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#* Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#* Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing listR-br@listas.c3sl.ufpr.brhttps://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing listR-br@listas.c3sl.ufpr.brhttps://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

Peço desculpas pela falta de clareza, ela é em razão do pouco conhecimento sobre o R. Entretanto, a indicação do laço while foi suficiente para resolver a questão da seguinte forma: obs.: talvez ainda haja maneira mais rápida: #Loop 2 n = nrow(y) while (any ( (diff(y[,5]) == 0 & y[(-n), 13] == 'NC' & y[-1, 13] !='NC' ))) { y[-1, 13] = ifelse(diff(y[,5]) == 0 & y[-n, 13] == 'NC', 'NC', y[-1, 13]) } }) #Loop 3: dy = diff(y[,5]) y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy < 0, 'DOWNTICK', y[-1, 13]) y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy > 0, 'UPTICK', y[-1, 13]) while (any(y[,13]=="C")) { y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy == 0 & y[-n, 13] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 13]) y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy == 0 & y[-n, 13] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 13]) } }) Muito agradecido, Luciano. Em 6/20/2011 9:16 PM, Benilton Carvalho escreveu:
Luciano,
por gentileza, de uma descricao precisa e um exemplo reproduzivel do codigo ao qual vc se refere como lento para que possamos tentar ajudar.
O exemplo que te dei reproduz exatamente o codigo que voce passou... mas entendo que, alem da eficiencia do codigo, vc se refere a um outro problema, que me parece poder ser resolvido com a execucao do codigo que passei em um laco while (no qual vc armazena o estado anterior da sua tabela e suspende a execucao quando voce obtiver duas tabelas identicas).
Dito isso, passe-nos um exemplo detalhado das condicoes necessarias para cada caso possivel, incluindo uma tabela inicial (que possa ser preferencialmente lida sem maiores trabalhos por quem se propoe a te ajudar) e a tabela final correta, a ser obtida no fim da execucao da rotina.
b
2011/6/21 Luciano Ramos Gonçalves <lrg.financas@gmail.com <mailto:lrg.financas@gmail.com>>
A correção foi acertada. Mas não era o problema que eu havia mencionado. Por exemplo:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $10.00 NC 1/1/2011 30 $10.00 NC 1/1/2011 40 $10.00 NC 1/1/2011 50 $10.20 UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 ZERO.UPTICK 1/1/2011 80 $10.20 ZERO.UPTICK 1/1/2011 90 $10.20 ZERO.UPTICK
Assim é que a seguinte sequencia deveria ser classificada, Mas o código tem dado essa resposta: Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $10.00 NC 1/1/2011 30 $10.00 C 1/1/2011 40 $10.00 C 1/1/2011 50 $10.20 UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 C 1/1/2011 80 $10.20 C 1/1/2011 90 $10.20 C
O código olha apenas para o imediatamente anterior, o que atrapalha o resultado.
Luciano.
Em 6/20/2011 8:29 PM, Benilton Carvalho escreveu:
os sinais nos diffs pro loop 3 estavam invertidos (essa era a parte do 'nao-testado'):
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
adicionalmente, os resultados que agora passo batem com aqueles providos pelo seu codigo original.
sobre o primeiro item nao ser classificado no loop 2, e' um reflexo do que o seu codigo faz, pois ele comeca a classificar em y[i+1,4] com 'i' comecando em 1...
b
2011/6/21 Luciano Ramos Gonçalves <lrg.financas@gmail.com <mailto:lrg.financas@gmail.com>>
Fiz uns testes e realmente ficou muito mais rápido. Apenas três problemas apareceram, todos com a mesma provável resolução. No loop 2: O primeiro negócio não é classificado, e os próximos, digamos, 6, mantém o mesmo preço, logo, todos estes deveriam ser não classificados. O código apenas desclassifica o subsequente. Para que estivesse ok, teria que ser repetido. No loop 3: Acontece algo semelhante. Se havia um Zero.DOWNTICK, e o próximo negócio também não mudou este tb deveria ser ZERO.DOWNTICK, mas o código está mantendo "C".
Grato,
Luciano.
Em 6/20/2011 5:34 PM, Benilton Carvalho escreveu:
abaixo, nao testado, deve estar bem proximo do q vc precisa. b
loop 1:
y[,4] = ifelse(y[,2] == 10, 'NC', 'C')
loop 2:
n = nrow(y) y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4])
loop 3:
dy = diff(y[,3]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
2011/6/20 Luciano Ramos Gonçalves <lrg.financas@gmail.com <mailto:lrg.financas@gmail.com>>
Colaboradores do grupo, realizei um teste de financas em R, conhecido como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa ajudar a torná-lo mais ágil.
Grato, Luciano
Resumidamente: 1 - Prentende-se classificar mudanças de preço em uma ação. 2 - O primeiro negócio do dia não é classificado. Os negócios subsequentes em que haja estabilidade no preço tb não são classificados. 3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, ZERO.DOWNTICK.
Um exemplo dos dados:
Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 $9.90 DOWNTICK 1/1/2011 30 $9.90 ZERO.DOWNTICK 1/1/2011 40 $10.10 UPTICK 1/1/2011 50 $10.20 UPTICK 1/2/2011 10 $9.80 NC 1/2/2011 20 $9.80 NC 1/2/2011 30 $9.90 UPTICK 1/2/2011 30 $9.90 ZERO.UPTICK
_*O CÓDIGO EM SI:*_ *#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia. x <- read.table("dados.txt",sep=";",header=F,skip=1) y <- cbind(x,(rep(NA,nrow(x))))
*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica. z <- 1:nrow(x) for (t in z) { if (y[t,2]==10) y[t,4]<-"NC" else y[t,4] <-"C" }
*# 2º Loop:* Se a operação anterior não foi classificada e o preço não mudou na atual, desclassifica esta também. w <- 1:(nrow(x)-1) for (i in w) { if (y[i,4]=="NC" & y[i,3]==y[i+1,3]) y[i+1,4]<-"NC" } *# 3º Loop:* divide as operações classificadas em quatro classes: for (i in w) { *#*Se o preço diminuiu, DOWNTICK; if (y[i+1,4]=="C" & y[i,3]>y[i+1,3]) y[i+1,4]<-"DOWNTICK" *#*Se o preço aumentou, UPTICK; if (y[i+1,4]=="C" & y[i,3]<y[i+1,3]) y[i+1,4]<-"UPTICK" *#* Se o preço permaneceu constante, mas a ultima variação foi positiva, ZERO.UPTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK")) y[i+1,4]<-"ZERO.UPTICK" *#*Se o preço permaneceu constante, mas a ultima variação foi negativa, ZERO.DOWNTICK; if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] & (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK")) y[i+1,4]<-"ZERO.DOWNTICK" }
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (2)
-
Benilton Carvalho
-
Luciano Ramos Gonçalves