[R-br] Problema pra criar Função - duvidas com rowSums

Henrique Dallazuanna wwwhsd em gmail.com
Sábado Abril 14 18:56:12 BRT 2012


Adicione drop = FALSE:

dados[,extintos, drop = FALSE]

2012/4/14 Augusto Ribas <ribas.aca em gmail.com>:
> Ola pessoal, estou com problemas pra deixar uma função generica o
> suficiente, acho que provavelmente a solução deve ser bem simples, mas não
> estou conseguindo solucionar
> alguem poderia me dar uma ajudinha?
> Minha intenção a partir de uma matriz de network entre hospedeiros e
> parasitos conseguir calcular quantos parasitos morrem ao um ou mais
> hospedeiros serem extintos.
> em baixo eu dou um exemplo de matriz e a função que num funciona direito
> para quando so 1 hospedeiro morre.
>
> #vamos supor uma matrix onde 1 indica que aquele parasita(linha) vive
> #dentro do hospedeiro tal(coluna)
> #são 6 parasitos e 6 hospedeiros
>
> dados<-matrix(c(1,1,1,0,0,0,
>                 0,0,1,0,0,0,
>                 0,0,1,0,0,0,
>                 0,0,0,1,0,0,
>                 0,0,0,1,1,0,
>                 0,0,0,0,0,1),byrow=T,ncol=6,nrow=6,
>                 dimnames=list(paste("P",1:6,sep=""),paste("H",1:6,sep="")))
> dados
>
> #Separando os hospedeiros
> hospedeiros<-dimnames(dados)[[2]]
> hospedeiros
>
> #Sorteando uma ordem de extinção para os  hospedeiros
> extinto<-sample(hospedeiros,ncol(dados),replace=F)
> extinto
>
> #função pra ver qts parasitas extinguem dados a morte dos hospedeiros
> extintos
> extcas<-function(dados,extintos) {
>   interações<-dimnames(dados)[[1]][which(rowSums(dados[,extintos]>0)>0)]
>   spextintas<-sum(rowSums(dados[interações,]>0)<=length(extintos))
>   return(spextintas)
>   }
>
> #ela funciona mais ou menos
> #se todos os hospedeiros morrem, todos os parasitos morrem
> extcas(dados,extinto)
> #se morre 3 hospedeiros, os 3 primeiros morre nesse caso...
> extcas(dados,extinto[1:3])
> #o mesmo acima pra 2
> extcas(dados,extinto[1:2])
>
> #Agora qd tento pra ver so pra 1 hospedeiro não funciona
> extcas(dados,extinto[1:1])
>
> #o problema ta no rowSums
> #eu to usando esse comando pra ver qts vezes cada parasito interage com
> #os hospedeiros
> rowSums(dados[,extinto]>0)
> #a questão é até 2 ele funciona
> rowSums(dados[,extinto[1:2]]>0)
>
> #mas no 1 ele nao funciona
> rowSums(dados[,extinto[1:1]]>0)
>
> #pq ai nao fica uma matriz fica um vetor
> #então tem como eu faze o R entender isso
> dados[,extinto[1:1]]>0
> #como uma matriz de 1 coluna e 6 linhas? Ai acho que o rowSums funcionaria
> #ou não sei se existe alguma solução mais interessante pra chegar no
> #mesmo resultado
> #mas tem que ser uma matrix que nao perca a informação do nome da coluna nem
> da linha pelo que entendo
>
> #minha meta final é fazer um grafico onde no eixo x é o numero de
> #especies extintas acumulado de hospedeiros e no Y qts parasitas
> #extinguiram juntos
> #então se essa função funcionar eu faço um loop pra cada número de
> #hospedeiros mortos, qts parasitas morrem juntos.
>
> #vetor pra receber o resultado
> resultado<-rep(NA,6)
> resultado
> #loop
> for(i in 2:6) {
>   resultado[i]<-extcas(dados,extinto[1:i])
>  }
> resultado
> #grafico
> plot(resultado~c(1:6),type="b",xlab="Número de hospedeiros extintos",
>   ylab="Número de parasitos extintos")
>
> #eu quero chegar nesse grafico, que fica faltando o resultado pro primeiro
> #hospedeiro morto.
>
> --
> Grato
> Augusto C. A. Ribas
>
> Site Pessoal: http://augustoribas.heliohost.org
> Lattes: http://lattes.cnpq.br/7355685961127056
>
>
> _______________________________________________
> 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.



-- 
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O


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