[R-br] For loop

Cesar Rabak cesar.rabak em gmail.com
Segunda Agosto 10 13:19:14 BRT 2015


Carolina,

Dê uma olhada na resposta que dei para o Franklin na trédi "Dúvida com
lógica booleana"

2015-08-10 9:17 GMT-03:00 Carolina Magda Roma <carolina.magda.adm em gmail.com>
:

> Olá,
>
> Estou trabalhando neste código aqui:
>
> Código:
>
> # Para selecionar o vm_data>0
> rownames.positive <- function(data, i) {
>     return <- colnames(data)[!is.na(data[i,])]
> }
>
> # Para selecionar os rets>0
> rownames.positive1 <- function(data, j) {
>   return <- colnames(data)[!is.na(data[j,])]
> }
>
>
> valid.tickers <- function(vm_data,rets, years, years1) { #years =
> rownames(vm_data), years1 = rownames(rets)
>     nomeativos <- list()
>     for (i in 1:dim(vm_data)[[1]]){
>       for (j in 1: dim(rets)[[1]]){ # i=2; j=42
>         a <- rownames.positive(vm_data, years[i])
>         b <- rownames.positive1(rets[,a], years1[j])
>         nomeativos[[j]] <- b
>     }}
>     names(nomeativos)<-years1[1:j]
>     return(nomeativos)
> }
>
>
> Estou tentando fazer dois filtros em um banco de dados, no qual primeiro
> verifico se existe vm_data>0 através da função rownames.positive e,
> consequentemente, para os ativos que passaram neste filtro, aplico a função
> rownames.positive1 para identificar rets>0. Com isso, uso a função
> valid.tickers para aplicar os dois filtros e retornar uma lista com apenas
> os ativos (AT) válidos.
>
> Minhas variáveis vm_data e rets estao abaixo:
>
> vm_data
>
>                           At1         At2               At3           At4
>            At5           At6
> 2000-01-01       NA       7.478553 106.05138 154.9142 246.72923 84.74537
> 2000-02-01 56.45321  22.248116  49.97758 124.3428 100.43189 57.89444
> 2000-03-01 10.53851 222.545990  15.49008  36.3656  47.19245 51.59810
>
> head(rets,10)
>                            At1                   At2             At3
>        At4              At5             At6
> 2000-01-01 -0.84032326  1.18251249  0.2791886 -0.3506028 -1.2780974
>  0.61644019
> 2000-01-03  1.93239850 -0.05272626  0.2532625  1.3811129  1.1809074
> -2.00703218
> 2000-01-04  0.56596405  0.36471560  1.2898374  1.0211276 -1.0492678
> -0.13936848
> 2000-01-05 -0.72244969 -2.13653307  0.6436690 -1.4931114  1.4653181
> -0.65127247
> 2000-01-06 -0.15135535 -1.15261317  0.1577168  0.1466359  1.4614018
>  1.29129399
> 2000-01-07  0.08811143 -0.93320399 -0.6568275 -1.1365693 -0.1147392
>  1.16723028
> 2000-01-08 -1.01018908 -0.79147444 -0.2458063  0.6530664 -0.2351105
> -1.56632861
> 2000-01-10 -1.41642902 -0.73998066         NA -0.1959526  1.6433762
> -1.83665410
> 2000-01-11 -1.88839674 -1.07155233 -0.9909747  1.5976778  1.1155120
>  0.02490766
> 2000-01-12 -0.68444922 -0.69488280 -0.3216356  0.0174740 -0.2322832
>  0.48464970
>
> tail(rets)
>
>                               At1                 At2             At3
>          At4            At5            At6
> 2000-02-29 -0.061260477  0.3558457  1.0351393  0.5690812 -0.5696858
> -0.4889139
> 2000-03-01  1.023446137  0.2470349  0.2481944  0.7226727  0.9731186
> -0.6501507
>
> O problema que não estou conseguindo resolver é que meu "for" para o
> contador j está errado. Quero que para cada i (mês) de vm_data selecionar
> apenas os rets>0 para os dias desse respectivo mês usando contador j. Da
> forma como está no meu código valid.tickers está retornando através de
> nomeativos que na data $'2000 - 01 - 01 os AT de 1 a 6 passaram nos dois
> filtros, o que não é verdade, pois para todo o mês 01, o AT1 já não deveria
> aparecer, pois a variável vm_data na linha 1 tem AT1 = NA. Assim,
> valid.tickers parece armazenar apenas o i=3 para j= 1:dim(rets)[[1]], pois
> se eu fizer manualmente i=1 e j=1, o resultado está correto, mas quando uso
> o "for" não.
>
> Portanto, como posso fazer i=1,2 e 3 sendo que para cada i quero delimitar
> que o contador j possa varrer apenas aquelas observações da variável rets
> nas quais o mês e ano de rets são iguais aos de i? Quero um resultado final
> com uma lista de length=52, que é a dim(rets)[[1]], no qual, por exemplo,
> nomeativos[[j]] = b retorne que $'2000-01-01' os AT de 2 a 6 sao válidos
> (pois, vm_data para o mês 01 no AT1 = NA e no rets todos os demais AT são
> maiores que zero), de igual maneira,  $'2000-02-18' retorne apenas os AT 1,
> 2, 4, 5 e 6 (pois, não há NA no vm_data para o mês 2, mas há um NA na
> variável rets para o AT3 nessa data).
>
> Obrigada pela ajuda!
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> R-br mailing list
> R-br em 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.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150810/5ec9b93c/attachment.html>


Mais detalhes sobre a lista de discussão R-br