<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body>
Olá Jônatan. Muito obrigado era exatamente isso que queria. Uma
interpolação mais flexível. tenho uma banco de dados muito grande e
fazer tudo isso na mão seria muito dispendioso. Irei estudar seu
código para compreender e absorver este conhecimento.<br>
<br>
Aproveitando quero também agradecer ao Benilton pela ajuda, que me
me será útil em outro banco de dados que possuo.<br>
<br>
Meus sinceros agradecimentos<br>
<br>
<br>
<br>
<br>
<div class="moz-cite-prefix">On 02-10-2014 22:22, Jônatan wrote:<br>
</div>
<blockquote
cite="mid:CAEiHnvOL_8raWcyo+wZRwsjDQQNG4gjpgAcLBoOHm=8BqmF_Ww@mail.gmail.com"
type="cite">
<div dir="ltr">Pelo que entendi, tu queres ter um peso interpolado
para cada dia entre o período de medidas de peso de cada animal?
<div><br>
</div>
<div>
<div>dados3 <- droplevels(dados2)</div>
<div>## lista com dados divididos por animal</div>
<div>s <- split(x = dados3, f = dados3$Animal)</div>
<div><br>
</div>
<div>## looping para na série de cada animal</div>
<div>l <- lapply(s, function(x) {</div>
<div> # x <- s[[1]]</div>
<div> print(unique(as.character(x$Animal)))</div>
<div> x0 <- subset(x, sel = c("Data",
"Animal", "Peso"))</div>
<div> ## datas de referência, desde o
primeiro dia ao último com peso</div>
<div> dref <- data.frame(Data =
seq(min(x$Data), </div>
<div>
max(x$Data), </div>
<div> by =
"days"))</div>
<div> ## gera série de pesos com NAs para
as datas sem medida</div>
<div> m <- merge(dref, x, all = T)</div>
<div> ## repete o ID do animal</div>
<div> m$Animal <-
sort(unique(m$Animal))</div>
<div> ## interpola peso para cada dia
do período entre a 1a e última medida</div>
<div> m$Peso_int <- approx(x =
m$Data, </div>
<div> y = m$Peso, </div>
<div> xout =
m$Data)$y</div>
<div> m</div>
<div> }# end fun</div>
<div> )# end lapply</div>
<div><br>
</div>
<div>res <- ldply(l)</div>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">2014-10-02 21:57 GMT-03:00 Fernando
Souza <span dir="ltr"><<a moz-do-not-send="true"
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> É o seguinte. Os dados que tenho são de pesagens de
animais . Em geral estas pesagens são feitas a intervalos
fixos (por exemplo a cada 15 dias). sendo assim para
estimar os pesos diários entre duas pesagens eu pretendo
interpolar 13 valores entre as medidas. Acontece que
nestes dados nas pesagens não ocorreram em intervalos
fixos e sendo assim para o animal 1 por e xemplo para a
pesagem na data 1 e pesagem na data 2 tenho intervalo de
13 dias, entre a pesagem na data 2 e pesagem na data 3
tenho 10 dias de intervalo e o mesmo ocorre para outros
animais. Na função approx(x,y,n) é possível definir o
número de valores interpolados no argumento n. O default é
50, ou seja ele interpola 50 dados entre dois pares
(x1,y1) (x2,y2) e 50 dados para os pares (x2,y2)(x3,y3).
Acontece que se no intervalo deste último par de
coodernada (ond x(i) é data) necessitar de 20 valores
(intervalo de 20 dias) eu não tenho como controlar, pois
será gerado 50 dados. Por isso estou pensando em uma forma
de ler o intervalo entre duas coordenadas (x,y) e fornecer
este valor para o agumento n da função approx. <br>
<br>
Pois da forma como está sendo interpolado para alguns
animais tenho de deletar valores enquanto em outros terei
de adicionar mais.<br>
<br>
Att
<div>
<div class="h5"><br>
<div>On 02-10-2014 19:47, Benilton Carvalho wrote:<br>
</div>
<blockquote type="cite">
<p dir="ltr">Oi Fernando, o problema é que não
entendo o que é o valor de n que vc quer para cada
caso. b</p>
<div class="gmail_quote">On Oct 2, 2014 4:16 PM,
"Fernando Souza" <<a moz-do-not-send="true"
href="mailto:nandodesouza@gmail.com"
target="_blank">nandodesouza@gmail.com</a>>
wrote:<br type="attribution">
<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))<br>
<br>
<div>On 01-10-2014 15:50, Benilton Carvalho
wrote:<br>
</div>
<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
moz-do-not-send="true"
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 moz-do-not-send="true"
href="mailto:R-br@listas.c3sl.ufpr.br"
target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a moz-do-not-send="true"
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
moz-do-not-send="true"
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 moz-do-not-send="true" href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a>
<a moz-do-not-send="true" 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 moz-do-not-send="true" 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>
<br>
_______________________________________________<br>
R-br mailing list<br>
<a moz-do-not-send="true"
href="mailto:R-br@listas.c3sl.ufpr.br"
target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a moz-do-not-send="true"
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
moz-do-not-send="true"
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>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
R-br mailing list
<a moz-do-not-send="true" href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a>
<a moz-do-not-send="true" 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 moz-do-not-send="true" 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 moz-do-not-send="true"
href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a moz-do-not-send="true"
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 moz-do-not-send="true"
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
style="font-size:small" face="arial"><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
moz-do-not-send="true"
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>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
R-br mailing list
<a class="moz-txt-link-abbreviated" href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a>
<a class="moz-txt-link-freetext" href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a>
Leia o guia de postagem (<a class="moz-txt-link-freetext" href="http://www.leg.ufpr.br/r-br-guia">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.</pre>
</blockquote>
<br>
</body>
</html>