<div dir="ltr">Para parte final do seu script ("<span style="font-family:arial,sans-serif;font-size:13px">Conversão da lista Res para dataframe"</span>) acho (não testado nos seus dados) que com um df <- melt(res) você converte para dataframe. A função melt está disponível no pacote reshape2.<div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-10-02 16:15 GMT-03:00 Fernando Souza <span dir="ltr"><<a href="mailto:nandodesouza@gmail.com" target="_blank">nandodesouza@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
Caro Benilton, tudo bem?<br>
O código que você me passou fez exatamente o que eu queria, mas
estou tendo o seguinte problema.<br>
Na função approx () eu determino o número de medidas fixas (n) entre
observações. No entanto eu tenho número de observações diferentes
entre animais e intervalo entre observações diferentes.<br>
Por exemplo: Animal 1 possuo 4 pesagens intervaladas de 10 dias (ou
seja 40 observações) ,animal 2 tenho 3 pesagens intervaladas 15 dias
(75 observações) etc... e sendo assim ao determinar um número fixo
(n) p.ex aprrox(x,y,n=15) eu terei 60 observações para o animal 1
(excedente de 10) e 75 observações animais 2 (exato)<br>
<br>
Eu estou pensando em uma função que pudesse alterar o valor de n
para cada intervalo entre observações. Como é possível fazer isso<br>
<br>
dados2<-structure(list(Animal = structure(c(1L, 1L, 1L, 1L, 1L,
1L, 8L, <br>
8L, 8L, 16L, 16L, 16L, 16L, 16L, 16L, 24L, 24L, 24L, 34L, 34L, <br>
34L, 37L, 37L, 37L, 37L, 37L, 37L), .Label = c("1", "12", "14", <br>
"15", "17", "18", "19", "2", "21", "22", "23", "25", "26", "*27", <br>
"28", "3", "30", "32", "34", "35", "37", "38", "39", "4", "40", <br>
"41", "42", "43", "44", "46", "47", "48", "49", "5", "50", "53", <br>
"7", "8", "9"), class = "factor"), Gest = c(140L, 140L, 140L, <br>
140L, 140L, 140L, 100L, 100L, 100L, 130L, 130L, 130L, 130L, 130L, <br>
130L, 100L, 100L, 100L, 100L, 100L, 100L, 140L, 140L, 140L, 140L, <br>
140L, 140L), Manej = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, <br>
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, <br>
2L), Data = structure(c(-715270, -715256, -715241, -715228, -715214,
<br>
-715193, -715270, -715256, -715235, -715270, -715256, -715241, <br>
-715228, -715214, -715200, -715270, -715256, -715235, -715270, <br>
-715256, -715235, -715270, -715256, -715241, -715228, -715214, <br>
-715193), class = "Date"), IntervaloPeso = c(14L, 15L, 13L, 14L, <br>
21L, 0L, 14L, 21L, 0L, 14L, 15L, 13L, 14L, 14L, 0L, 14L, 21L, <br>
0L, 14L, 21L, 0L, 14L, 15L, 13L, 14L, 21L, 0L), Peso = c(37, <br>
38.2, 41, 42.9, 43, 49, 40, 41.8, 40.8, 38, 39.9, 41.9, 45.2, <br>
46.2, 51.8, 40, 40.9, 41.9, 32.3, 34.9, 35, 35.1, 36.5, 35.2, <br>
38.3, 38, 40.5)), .Names = c("Animal", "Gest", "Manej", "Data", <br>
"IntervaloPeso", "Peso"), row.names = c(NA, 27L), class =
"data.frame")<br>
<br>
library(plyr)<br>
library(zoo)<br>
intervalo<- ddply(dados2, .(Animal), summarise, intervalo =
diff(Data)) #intervalo entre medidas<br>
n_observacao<- as.vector(table(dados2$Animal)) #nunero de
observações em cada animal<br>
#----------------------------------------------------------------------------------------------------------------------------<br>
#isso é que esto tentando fazer ! mas não funciona<br>
myf2<-function(mydf,intervalo){<br>
+ for(i in 1:length(intervalo$periodo)){<br>
+ approx(mydf$Data,mydf$Peso,n=intervalo$periodo[i])}<br>
}<br>
res <- dlply(dados2, .(Animal), myf2)<br>
<br>
#-----------------------------------------------------------------------------------------------<br>
Exemplo do Benilton, n fixo igual a 15<br>
<br>
myf <- function(mydf)<br>
with(mydf, approx(Data, Peso,n= 15)) #esta funçao realiza a
interpolaçao agrupada por animal<br>
<br>
res <- dlply(dados2, .(Animal), myf)<br>
<br>
<br>
<br>
#------------------------------------Conversão da lista Res para
dataframe--------------------------------------------------------------------------------------<br>
<br>
df<-data.frame(Data=unlist(sapply(res, "[",
1)),Peso=unlist(sapply(res,"[",2))) #remove os dados da lista e o
converte em data frame<br>
ID<-row.names(df)#captura os nomes das linhas do data frame<br>
df<-cbind(ID,df)#adiciona os nomes da linha como coluna de
identificaçao<br>
row.names(df)<-NULL#remove nome das linhas<br>
df$Data<-as.Date(df$Data) #base de dados com formato de data
corrigida<br>
df$Animal<-factor(rep(unique(levels(dados2$Animal)),each=50))<span class=""><br>
<br>
<div>On 01-10-2014 15:50, Benilton Carvalho
wrote:<br>
</div>
</span><div><div class="h5"><blockquote type="cite">
<div dir="ltr">Oi Fernando,
<div><br>
</div>
<div>alguns comentarios antes.... Quando vc diz de interpolar,
vc quer "peso" como sendo sua variavel "Y" e "dia/data/etc"
como eixo "X"... correto?</div>
<div><br>
</div>
<div>Se for este o caso, a sua chamada de 'approx' esta'
incorreta... o "X" e' o primeiro argumento... e o "Y" e' o
segundo.</div>
<div><br>
</div>
<div>Alem disso, no codigo abaixo, colocarei a interpolacao para
funcionar direto das datas... se isso vai fazer sentido (ou
nao), deixo pra vc "descobrir" (a dica e' que o R vai achar
uma representacao numerica para data e converte-la antes do
ajuste... experimente um pouco e veja se e' conveniente para o
seu caso. Se nao for, crie a variavel adequada a priori).</div>
<div><br>
</div>
<div>Usando o seu conjunto de dados de exemplo (colado abaixo
apenas para conveniencia):</div>
<div><br>
</div>
<div>
<div>set.seed(20)</div>
<div>dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),</div>
<div> Peso=rnorm(20,30,4),</div>
<div>
data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),</div>
<div>
as.Date("30/04/2009",'%d/%m/%Y'),length.out=30), 20),</div>
<div> day=1:20)</div>
</div>
<div><br>
</div>
<div>Tudo o que vc precisa e' criar uma funcao que funcione num
data.frame de mesma estrutura que este acima.... Veja o codigo
abaixo:</div>
<div><br>
</div>
<div>
<div>myf <- function(mydf)</div>
<div> with(mydf, approx(data, Peso))</div>
</div>
<div><br>
</div>
<div>Tudo o que a funcao 'myf' faz e' a interpolacao Peso x data
num data.frame generico chamado 'mydf'... Note que a funcao e'
burra o suficiente pra nao saber que existem animais
diferentes... mas se vc tivesse um data.frame para cada
animal, isso funcionaria...</div>
<div><br>
</div>
<div>Entao agora e' dividir os data.frames por animal e ter os
resultados... Para isso, eu gosto de usar o pacote 'plyr'...
Como a entrada de dados e' a partir de um data.frame (d) e a
saida eu quero que seja numa lista (l), entao vc usa o comando
'dlply'...</div>
<div><br>
</div>
<div>
<div>library(plyr)</div>
<div>res <- dlply(dados, .(ANIMAL), myf)</div>
</div>
<div><br>
</div>
<div>Por fim, o que isso faz e': pegar o seu data.frame
completo, quebrar em data.frames menores usando a variavel
'ANIMAL' e, em cada data.frame menor, aplicar a funcao
'myf'.... Seu resultado 'res', e' uma lista... cada elemento
da lista e' um resultado do approx para cada animal...</div>
<div><br>
</div>
<div>b</div>
<div><br>
</div>
<div><br>
</div>
<div>
<div>
<div>set.seed(20)</div>
<div>dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),</div>
<div> Peso=rnorm(20,30,4),</div>
<div>
data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),</div>
<div>
as.Date("30/04/2009",'%d/%m/%Y'),length.out=30), 20),</div>
<div> day=1:20)</div>
</div>
</div>
<div>
<div>
<div>myf <- function(mydf)</div>
<div> with(mydf, approx(data, Peso))</div>
</div>
</div>
<div>
<div>
<div>library(plyr)</div>
<div>res <- dlply(dados, .(ANIMAL), myf)</div>
</div>
</div>
<div><br>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">Em 1 de outubro de 2014 14:16, Fernando
Souza <span dir="ltr"><<a href="mailto:nandodesouza@gmail.com" target="_blank">nandodesouza@gmail.com</a>></span>
escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Caros
amigos<br>
<br>
Estou necessitando faze a interpolação de algumas pesagens
tomadas em diferentes animais. Eu preciso da interpolação
feita para cada animal separadamente e o intervalo entre
medidas não é fixo. Eu estou utilizando a função approx() no
entanto devido ao número de animais utilizados fica muito
dispendioso fazer fazer esta interpolação uma a uma. Por
isso gostaria de uma função onde um pudesse automatizar este
procedimento.<br>
<br>
set.seed(20)<br>
dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),Peso=rnorm(20,30,4),
data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),<br>
as.Date("30/04/2009",'%d/%m/%Y'),length.out=30),20),day=1:20)<br>
<br>
Estou tentando fazer uma função que estime os pontos da
interpolação agrupados por Animal . Entretanto tenho pouco
conhecimento em programação para fazer isso. Tenho tentado
fazer isso, sem muito sucesso.<br>
Alguém poderia me ajudar? Abraços<br>
<br>
aprendendo<-function(dados){<br>
niveis<-levels(dados$ANIMAL)<br>
dia<-diff(dados$data)<br>
for(i in min(niveis):max(niveis)){<br>
<br>
b<- approx(dados[dados$ANIMAL==as.numeric(i),]$Peso,dados[dados$ANIMAL==as.numeric(i),]$data),n=15)<br>
}<br>
return(b)<br>
}<br>
_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>)
e forneça código mínimo reproduzível.<br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
R-br mailing list
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.</pre>
</blockquote>
<br>
</div></div></div>
<br>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><div><font style="font-family:arial">###############################################################</font><br><span style="font-family:arial;font-size:small">## </span><span style="font-size:11px;text-align:center;background-color:rgb(239,239,239);color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;line-height:13px">Jônatan Dupont Tatsch</span></div><div><span style="font-family:arial;font-size:small">## </span><span style="color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:10.909090995788574px;line-height:12.997159004211426px;text-align:center;background-color:rgb(239,239,239)">Professor do Departamento de Física</span><font face="arial" style="font-size:small"><br></font></div><div><span style="font-size:small;font-family:arial">## </span><span style="color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:10.909090995788574px;line-height:12.997159004211426px;text-align:center;background-color:rgb(239,239,239)">Centro de Ciências Exatas e Naturais (CCNE)</span><br></div><div><span style="font-size:small;font-family:arial">## </span><span style="color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:10.909090995788574px;line-height:12.997159004211426px;text-align:center;background-color:rgb(239,239,239)">Universidade Federal de Santa Maria</span></div><div><span style="font-family:arial;font-size:small">## </span><span style="font-size:11px;text-align:center;background-color:rgb(239,239,239);color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;line-height:13px">Faixa de Camobi, Prédio 13 - Campus UFSM - </span><span style="font-size:11px;text-align:center;background-color:rgb(239,239,239);color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;line-height:13px">Santa Maria, RS, Brasil - 97105-900</span><br></div><div style="font-family:arial;font-size:small">## <span style="font-size:11px;text-align:center;background-color:rgb(239,239,239);color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;line-height:13px">Telefone: +55(55)33012083</span><br></div><div style="font-family:arial;font-size:small">## <span style="font-size:11px;text-align:center;background-color:rgb(239,239,239);color:rgb(150,150,150);font-family:Verdana,Arial,Helvetica,sans-serif;line-height:13px"><a href="http://www.ufsm.br/meteorologia" target="_blank">www.ufsm.br/meteorologia</a></span></div><div style="font-family:arial;font-size:small">###############################################################</div></div>
</div>