<div dir="ltr"><div>myf2 <- function(df){</div><div>    pesoFun <- with(df, approxfun(Data, Peso))</div><div>    dts <- with(df, range(Data))</div><div>    dates <- seq(dts[1], dts[2], by='days')</div><div>    pred <- data.frame(Data=dates, Animal=unique(df$Animal), PesoPred=pesoFun(dates))</div><div>    merge(df, pred, all=TRUE)</div><div>}</div><div><br></div><div>library(plyr)</div><div>out <- ddply(dados2, .(Animal), myf2)</div><div><br></div><div><br></div><div>b</div></div><div class="gmail_extra"><br><div class="gmail_quote">Em 2 de outubro de 2014 21:57, 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">
  
    
  
  <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 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 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>
          <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>
      <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>

</blockquote></div><br></div>