Problema pra criar Função - duvidas com rowSums

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

Adicione drop = FALSE: dados[,extintos, drop = FALSE] 2012/4/14 Augusto Ribas <ribas.aca@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@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

Uia, funcionou perfeitamente, muito obrigado. Em 14 de abril de 2012 17:56, Henrique Dallazuanna <wwwhsd@gmail.com>escreveu:
Adicione drop = FALSE:
dados[,extintos, drop = FALSE]
2012/4/14 Augusto Ribas <ribas.aca@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@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 _______________________________________________ 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.
-- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
participantes (2)
-
Augusto Ribas
-
Henrique Dallazuanna