Ajuda com criação de loop para transforma lista em matrix de presença e ausencia

Ola pessoal. Estou aqui denovo pra pedir uma ajudinha. Eu estou com uns dataframes com 2 colunas, uma são nome de especies de hospedeiro e outra nome de especie de parasita. Ai a lista é na verdade parasita tal ocorreu em hospedeiro fulano Até aqui tudo bem, agora eu empaquei pq queria transformar isso em uma matriz de presensa e ausencia, com colunas sendo parasitos e linhas hospedeiro, ai onde tem interação entre os 2 fica preenchido com 1 e onde nao tem com 0. Eu fiz um exemplo com uma matriz pequenininha e como eu estou tentando resolver. Pensei em usar um teste de logica pra ir preenchendo a matriz mas eu não sei como fazer isso de modo eficiente. Pq o maximo que cheguei foi testar cada celula da matriz com toda a lista, e como a lista é meio grande é meio perdido fazer assim. Mas segue o exemplo que acho que ta facil entender, se alguem tiver uma solução facil na manga faria minha semana muito feliz :) #------------------------------------------------------------------------------------------------- #exemplo de dados dados<-data.frame(parasito=c("a","b","b","c","d","d"), hospedeiro=c("1","1","1","2","2","3")) #como eles estão agora dados #Eu preciso de uma matriz de presença e ausencia #dai faço uma matriz matriz<-matrix(data=NA,nrow=length(unique(dados$parasito)), ncol=length(unique(dados$hospedeiro)), dimnames=list(c(as.character(unique(dados$parasito))), c(as.character(unique(dados$hospedeiro))))) #blz agora preciso que a lista em dados seja representada #atraves dessa matriz matriz #Eu imaginei um teste assim #Linha 1 coluna 1 matriz[1,1]<-ifelse(colnames(matriz)[1]==dados$hospedeiro[1] & rownames(matriz)[1]==dados$parasito[1] ,1,0) #aqui eu testei se a primeira linha do data.frame corresponde a essa interação, como corresponde ele coloca 1 matriz #linha 1 Coluna 2 matriz[1,2]<-ifelse(colnames(matriz)[2]==dados$hospedeiro[1] & rownames(matriz)[1]==dados$parasito[1] ,1,0) #o mesmo pra linha 1 coluna 2, ele coloca 0 pq a a primeira linha do data.frame não corresponde a essa interação matriz #Blz, mas eu não consegui pensar em um jeito de faze ele rodar pra #toda a matriz que eu tenho de forma direta, eu queria monta um loop #ou algo do tipo que eu so fala-se o tamanho da matriz e ele testa-se #logo tudo, ou melhor acho que seria faze algo que olhe a lista #e teste pra cada linha da lista e ponha um 1 la na matriz Obrigado e boa semana a todos. -- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056

Resolvido, eu não sei pq compliquei tanto. Obtive uma resposta assim: #-------------- with(dados, ifelse(table(parasito, hospedeiro) > 0, 1, 0)) #--------------- So não tinha conseguido visualizar isso sozinho. Mas agradeço a atenção de qualquer forma :) Em 26 de março de 2012 15:30, Augusto Ribas <ribas.aca@gmail.com> escreveu:
Ola pessoal. Estou aqui denovo pra pedir uma ajudinha. Eu estou com uns dataframes com 2 colunas, uma são nome de especies de hospedeiro e outra nome de especie de parasita. Ai a lista é na verdade parasita tal ocorreu em hospedeiro fulano Até aqui tudo bem, agora eu empaquei pq queria transformar isso em uma matriz de presensa e ausencia, com colunas sendo parasitos e linhas hospedeiro, ai onde tem interação entre os 2 fica preenchido com 1 e onde nao tem com 0. Eu fiz um exemplo com uma matriz pequenininha e como eu estou tentando resolver. Pensei em usar um teste de logica pra ir preenchendo a matriz mas eu não sei como fazer isso de modo eficiente. Pq o maximo que cheguei foi testar cada celula da matriz com toda a lista, e como a lista é meio grande é meio perdido fazer assim. Mas segue o exemplo que acho que ta facil entender, se alguem tiver uma solução facil na manga faria minha semana muito feliz :)
#------------------------------------------------------------------------------------------------- #exemplo de dados dados<-data.frame(parasito=c("a","b","b","c","d","d"), hospedeiro=c("1","1","1","2","2","3")) #como eles estão agora dados
#Eu preciso de uma matriz de presença e ausencia #dai faço uma matriz matriz<-matrix(data=NA,nrow=length(unique(dados$parasito)), ncol=length(unique(dados$hospedeiro)), dimnames=list(c(as.character(unique(dados$parasito))), c(as.character(unique(dados$hospedeiro)))))
#blz agora preciso que a lista em dados seja representada #atraves dessa matriz matriz
#Eu imaginei um teste assim #Linha 1 coluna 1 matriz[1,1]<-ifelse(colnames(matriz)[1]==dados$hospedeiro[1] & rownames(matriz)[1]==dados$parasito[1] ,1,0) #aqui eu testei se a primeira linha do data.frame corresponde a essa interação, como corresponde ele coloca 1
matriz
#linha 1 Coluna 2 matriz[1,2]<-ifelse(colnames(matriz)[2]==dados$hospedeiro[1] & rownames(matriz)[1]==dados$parasito[1] ,1,0) #o mesmo pra linha 1 coluna 2, ele coloca 0 pq a a primeira linha do data.frame não corresponde a essa interação matriz
#Blz, mas eu não consegui pensar em um jeito de faze ele rodar pra #toda a matriz que eu tenho de forma direta, eu queria monta um loop #ou algo do tipo que eu so fala-se o tamanho da matriz e ele testa-se #logo tudo, ou melhor acho que seria faze algo que olhe a lista #e teste pra cada linha da lista e ponha um 1 la na matriz
Obrigado e boa semana a todos.
-- Grato Augusto C. A. Ribas
Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
-- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
participantes (1)
-
Augusto Ribas