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

Augusto Ribas ribas.aca em gmail.com
Sábado Abril 14 18:48:23 BRT 2012


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
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120414/e0a31fa3/attachment.html>


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