
Caros amigos Estou tentando criar um função para calcular o ganho de peso médio. Eu quero calcular o ganho de peso por animal, sendo o ganho de peso a média dos ganhos obtidas a cada duas medidas sucessivas. Eu estou utilizando a função ddply() do pacote {plyr} onde divido o dataframe em grupos por ANIMAL e aplico a seguinte função a cada grupo. No entanto eu preciso que o ganho de peso obtido entre duas medidas consecutivas para um animal seja armazenado em um vetor, para em seguida fazer a média dos ganhos de pesos. No entanto não consigo criar esse vetor.Quando utilizo o comando abaixo, a função ddply retorna uma mensagem de erro indicando que não foi possível encontrar o objeto ganho. Como posso resolver esse problema? install.packages("plyr") library(plyr) A <- function(x){ for (i in 1:length(x$Pesos)-1){ difPeso <- x$Pesos[i+1] -x$Pesos[i] dias <-as.numeric( x$DATA[i+1] - x$DATA[i]) ganho [i]<-difPeso/dias # Gostaria de guardar este resultado em um vetor e retornar somente a média } return(mean(ganho)) } ddply(GPD,.(ANIMAL),A) GPD<- structure(list(DATA = structure(c(16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16454, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463), class = "Date"), ANIMAL = structure(c(1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 10L, 10L, 10L, 10L, 15L, 15L, 15L, 15L, 19L, 19L, 19L, 19L, 2L, 2L, 2L, 2L, 7L, 7L, 7L, 7L, 13L, 13L, 13L, 13L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 24L, 24L, 24L, 24L, 3L, 3L, 3L, 3L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 12L, 12L, 12L, 12L, 20L, 20L, 20L, 20L, 22L, 22L, 22L, 22L, 6L, 6L, 6L, 6L, 11L, 11L, 11L, 11L, 14L, 14L, 14L, 14L, 18L, 18L, 18L, 18L, 21L, 21L, 21L, 21L, 23L, 23L, 23L, 23L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "19", "20", "21", "22", "23", "24", "25" ), class = "factor"), TRAT = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("C", "T1", "T2", "T3"), class = "factor"), CONSUMO = c(0.6847039559, 0.659115454, 0.8601238438, 0.9662238017, 0.653160515, 0.76204388, 0.829147492, 1.0781859662, 0.5080284272, 0.7916373952, 0.7176244537, 1.2145475842, 0.5901562027, 0.5354316571, 0.9090091044, 0.8230424453, 0.800990936, 0.8258115771, 1.0350092142, 1.1778239333, 0.4218995736, 0.748182177, 0.9008559089, 0.7793604982, 0.8503107855, 0.8743924455, 1.0149210147, 1.2117686308, 1.0008721911, 0.9224992, 1.0628987486, 1.3235606054, 0.5847562394, 0.5971266995, 0.9015356047, 1.1422017785, 0.5506020875, 0.8996851452, 1.1010903098, 1.2777703226, 0.7757312968, 0.7327742822, 0.9957085833, 1.299725333, 0.6184034276, 0.7019017179, 0.8252818991, 0.7725886442, 0.57584, 0.8274993578, 0.9568347616, 1.0673499251, 0.7403614923, 0.7388590798, 0.7659735658, 1.0623794866, 0.6109657028, 0.683632284, 0.8188398169, 0.9643152772, 0.6384021189, 1.0495757074, 1.0262077037, 1.3312530279, 0.9202033913, 0.8721430158, 1.038471733, 1.1844675851, 0.8142008896, 1.0393409306, 1.2542648171, 1.3544221328, 0.5135583976, 0.5789023337, 0.7218802192, 1.0082128242, 0.7826673895, 0.9077870689, 0.9303001507, 1.4221483678, 0.8357668107, 0.8984098957, 1.0042573313, 1.5336138147, 0.407296, 0.6941073063, 0.8535336465, 0.9517448657, 0.5418470982, 0.5011396696, 0.6771379951, 0.6793475586, 0.7004441364, 0.9387915881, 1.0943207226, 1.2500940543 ), Pesos = c(14.75, 15.35, 16.8, 18.4, 17.6, 17.95, 19.2, 21, 19.4, 20.05, 21.4, 23.4, 14.55, 14.4, 15.1, 16.5, 19.1, 19.3, 20.4, 21.9, 16.3, 17.45, 18.9, 20.6, 22.25, 22.5, 23.5, 25.2, 22.8, 21.9, 24.2, 26.6, 18.45, 18.3, 19.5, 21.2, 21.8, 23.2, 22, 24.9, 18.6, 19.05, 20, 21, 17, 17.9, 18.5, 19.45, 20.6, 21.3, 22.6, 24.5, 19.1, 19.4, 20.1, 22.25, 16.65, 16.95, 17.8, 19.4, 22.8, 23.8, 24.4, 26.3, 19.3, 20.15, 21.9, 23.6, 22.9, 24.1, 25.6, 26.45, 16.65, 16.55, 17.3, 18.85, 22.4, 23.1, 25.4, 27.3, 22.9, 22.95, 25, 26.9, 16.7, 18.15, 19.7, 20.6, 14.05, 14.9, 15.6, 16.4, 18.9, 19.85, 21.8, 23.2)), .Names = c("DATA", "ANIMAL", "TRAT", "CONSUMO", "Pesos"), row.names = c(NA, -96L), class = "data.frame") -- Fernando Antônio de Souza Zootecnista,Dsc. Nutrição e alimentação animal (UFMG) Lattes: http://lattes.cnpq.br/6519538815038307 e-mail:nandodesouza@gmail.com (82)9618-6457 (tim) (82)8113-8781 (vivo) (82)3313-8781 (net) (31)9784-5273 (vivo-MG)

Isso pode ser feito de muitas formas, via muitos pacotes e funções. Dentre tantas, uma possibilidade seria essa. Certamente não é a melhor mas serve. str(GPD) xtabs(~TRAT+ANIMAL, data=GPD) xtabs(~DATA+ANIMAL, data=GPD) require(reshape) require(plyr) db <- cast(data=GPD, ANIMAL~DATA, value="Pesos") db$mGPD <- apply(db[,-1], MARGIN=1, function(x){ mean(diff(na.omit(x))) }) À disposição. Walmes.

Obrigado Walmes. Uma dúvida. Da forma como estava fazendo é possível chegar a este resultado? Onde eu estou errando? abrçs On 26-02-2015 13:29, walmes . wrote:
Isso pode ser feito de muitas formas, via muitos pacotes e funções. Dentre tantas, uma possibilidade seria essa. Certamente não é a melhor mas serve.
str(GPD)
xtabs(~TRAT+ANIMAL, data=GPD) xtabs(~DATA+ANIMAL, data=GPD)
require(reshape) require(plyr)
db <- cast(data=GPD, ANIMAL~DATA, value="Pesos")
db$mGPD <- apply(db[,-1], MARGIN=1, function(x){ mean(diff(na.omit(x))) })
À disposição. Walmes.
_______________________________________________ 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.
-- Fernando Antônio de Souza Zootecnista,Dsc. Nutrição e alimentação animal (UFMG) Lattes: http://lattes.cnpq.br/6519538815038307 e-mail:nandodesouza@gmail.com (82)9618-6457 (tim) (82)8113-8781 (vivo) (82)3313-8781 (net) (31)9784-5273 (vivo-MG)

Fernando, Você teria que criar um vetor 'ganho' dentro da função: A <- function(x){ ganho <- numeric(length(x$Pesos)-1) # Vetor para armazenar valores for (i in 1:length(x$Pesos)-1){ difPeso <- x$Pesos[i+1] -x$Pesos[i] dias <-as.numeric( x$DATA[i+1] - x$DATA[i]) ganho[i]<-difPeso/dias # Gostaria de guardar este resultado em } return(mean(ganho))} Uma alternativa seria usar o pacote 'dplyr' (só não carregue o 'plyr' na mesma sessão): library(dplyr) GPD1 <- GPD %>% group_by(ANIMAL) %>% mutate(DifPeso = c(NA, diff(Pesos)), Dias = c(NA, diff(DATA)), GanhoPorDia = DifPeso/Dias) %>% summarize(GanhoMedio = mean(GanhoPorDia, na.rm = TRUE)) De: Fernando Souza <nandodesouza@gmail.com> Para: "r-br@listas.c3sl.ufpr.br" <r-br@listas.c3sl.ufpr.br> Enviadas: Quinta-feira, 26 de Fevereiro de 2015 12:22 Assunto: [R-br] ddply - obter ganho de peso médio Caros amigos Estou tentando criar um função para calcular o ganho de peso médio. Eu quero calcular o ganho de peso por animal, sendo o ganho de peso a média dos ganhos obtidas a cada duas medidas sucessivas. Eu estou utilizando a função ddply() do pacote {plyr} onde divido o dataframe em grupos por ANIMAL e aplico a seguinte função a cada grupo. No entanto eu preciso que o ganho de peso obtido entre duas medidas consecutivas para um animal seja armazenado em um vetor, para em seguida fazer a média dos ganhos de pesos. No entanto não consigo criar esse vetor.Quando utilizo o comando abaixo, a função ddply retorna uma mensagem de erro indicando que não foi possível encontrar o objeto ganho. Como posso resolver esse problema? install.packages("plyr") library(plyr) A <- function(x){ for (i in 1:length(x$Pesos)-1){ difPeso <- x$Pesos[i+1] -x$Pesos[i] dias <-as.numeric( x$DATA[i+1] - x$DATA[i]) ganho [i]<-difPeso/dias # Gostaria de guardar este resultado em um vetor e retornar somente a média } return(mean(ganho)) } ddply(GPD,.(ANIMAL),A) GPD<- structure(list(DATA = structure(c(16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16454, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463, 16425, 16437, 16451, 16463), class = "Date"), ANIMAL = structure(c(1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 10L, 10L, 10L, 10L, 15L, 15L, 15L, 15L, 19L, 19L, 19L, 19L, 2L, 2L, 2L, 2L, 7L, 7L, 7L, 7L, 13L, 13L, 13L, 13L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 24L, 24L, 24L, 24L, 3L, 3L, 3L, 3L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 12L, 12L, 12L, 12L, 20L, 20L, 20L, 20L, 22L, 22L, 22L, 22L, 6L, 6L, 6L, 6L, 11L, 11L, 11L, 11L, 14L, 14L, 14L, 14L, 18L, 18L, 18L, 18L, 21L, 21L, 21L, 21L, 23L, 23L, 23L, 23L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "19", "20", "21", "22", "23", "24", "25" ), class = "factor"), TRAT = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("C", "T1", "T2", "T3"), class = "factor"), CONSUMO = c(0.6847039559, 0.659115454, 0.8601238438, 0.9662238017, 0.653160515, 0.76204388, 0.829147492, 1.0781859662, 0.5080284272, 0.7916373952, 0.7176244537, 1.2145475842, 0.5901562027, 0.5354316571, 0.9090091044, 0.8230424453, 0.800990936, 0.8258115771, 1.0350092142, 1.1778239333, 0.4218995736, 0.748182177, 0.9008559089, 0.7793604982, 0.8503107855, 0.8743924455, 1.0149210147, 1.2117686308, 1.0008721911, 0.9224992, 1.0628987486, 1.3235606054, 0.5847562394, 0.5971266995, 0.9015356047, 1.1422017785, 0.5506020875, 0.8996851452, 1.1010903098, 1.2777703226, 0.7757312968, 0.7327742822, 0.9957085833, 1.299725333, 0.6184034276, 0.7019017179, 0.8252818991, 0.7725886442, 0.57584, 0.8274993578, 0.9568347616, 1.0673499251, 0.7403614923, 0.7388590798, 0.7659735658, 1.0623794866, 0.6109657028, 0.683632284, 0.8188398169, 0.9643152772, 0.6384021189, 1.0495757074, 1.0262077037, 1.3312530279, 0.9202033913, 0.8721430158, 1.038471733, 1.1844675851, 0.8142008896, 1.0393409306, 1.2542648171, 1.3544221328, 0.5135583976, 0.5789023337, 0.7218802192, 1.0082128242, 0.7826673895, 0.9077870689, 0.9303001507, 1.4221483678, 0.8357668107, 0.8984098957, 1.0042573313, 1.5336138147, 0.407296, 0.6941073063, 0.8535336465, 0.9517448657, 0.5418470982, 0.5011396696, 0.6771379951, 0.6793475586, 0.7004441364, 0.9387915881, 1.0943207226, 1.2500940543 ), Pesos = c(14.75, 15.35, 16.8, 18.4, 17.6, 17.95, 19.2, 21, 19.4, 20.05, 21.4, 23.4, 14.55, 14.4, 15.1, 16.5, 19.1, 19.3, 20.4, 21.9, 16.3, 17.45, 18.9, 20.6, 22.25, 22.5, 23.5, 25.2, 22.8, 21.9, 24.2, 26.6, 18.45, 18.3, 19.5, 21.2, 21.8, 23.2, 22, 24.9, 18.6, 19.05, 20, 21, 17, 17.9, 18.5, 19.45, 20.6, 21.3, 22.6, 24.5, 19.1, 19.4, 20.1, 22.25, 16.65, 16.95, 17.8, 19.4, 22.8, 23.8, 24.4, 26.3, 19.3, 20.15, 21.9, 23.6, 22.9, 24.1, 25.6, 26.45, 16.65, 16.55, 17.3, 18.85, 22.4, 23.1, 25.4, 27.3, 22.9, 22.95, 25, 26.9, 16.7, 18.15, 19.7, 20.6, 14.05, 14.9, 15.6, 16.4, 18.9, 19.85, 21.8, 23.2)), .Names = c("DATA", "ANIMAL", "TRAT", "CONSUMO", "Pesos"), row.names = c(NA, -96L), class = "data.frame") -- Fernando Antônio de Souza Zootecnista,Dsc. Nutrição e alimentação animal (UFMG) Lattes: http://lattes.cnpq.br/6519538815038307 e-mail:nandodesouza@gmail.com (82)9618-6457 (tim) (82)8113-8781 (vivo) (82)3313-8781 (net) (31)9784-5273 (vivo-MG) _______________________________________________ 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.

Uma for mais simples, sem chamar o reshape e na linha do que você estava imaginando, seria require(plyr) ## Ordenar para assegurar ordem cronológica. da <- arrange(GPD, ANIMAL, DATA) str(da) f <- function(x){ mean(diff(na.omit(x))) } ddply(da, .(ANIMAL), summarise, mGPD=f(Pesos)) À disposição. Walmes.

Obrigado Walmes e Rubem pela atenção. O exemplo de vocês me atenderam muito bem. Entretanto Rubem, a sua sugestão com o pacote dplyr ele retorna um resumo, mostrando apenas as 10 primeiras linhas. Como eu faço para ver todo o resultado. Att On 26-02-2015 13:58, walmes . wrote:
Uma for mais simples, sem chamar o reshape e na linha do que você estava imaginando, seria
require(plyr)
## Ordenar para assegurar ordem cronológica. da <- arrange(GPD, ANIMAL, DATA) str(da)
f <- function(x){ mean(diff(na.omit(x))) }
ddply(da, .(ANIMAL), summarise, mGPD=f(Pesos))
À disposição. Walmes.
_______________________________________________ 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.
-- Fernando Antônio de Souza Zootecnista,Dsc. Nutrição e alimentação animal (UFMG) Lattes: http://lattes.cnpq.br/6519538815038307 e-mail:nandodesouza@gmail.com (82)9618-6457 (tim) (82)8113-8781 (vivo) (82)3313-8781 (net) (31)9784-5273 (vivo-MG)

É só para imprimir no console que aparece resumido. Você pode ver o resultado inteiro usando View() ou as.data.frame(). Att.,Rubem De: Fernando Souza <nandodesouza@gmail.com> Para: r-br@listas.c3sl.ufpr.br Cc: Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br>; walmes . <walmeszeviani@gmail.com> Enviadas: Quinta-feira, 26 de Fevereiro de 2015 15:32 Assunto: Re: [R-br] ddply - obter ganho de peso médio Obrigado Walmes e Rubem pela atenção. O exemplo de vocês me atenderam muito bem. Entretanto Rubem, a sua sugestão com o pacote dplyr ele retorna um resumo, mostrando apenas as 10 primeiras linhas. Como eu faço para ver todo o resultado. Att On 26-02-2015 13:58, walmes . wrote: Uma for mais simples, sem chamar o reshape e na linha do que você estava imaginando, seria require(plyr) ## Ordenar para assegurar ordem cronológica. da <- arrange(GPD, ANIMAL, DATA) str(da) f <- function(x){ mean(diff(na.omit(x))) } ddply(da, .(ANIMAL), summarise, mGPD=f(Pesos)) À disposição. Walmes. _______________________________________________ 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. -- Fernando Antônio de Souza Zootecnista,Dsc. Nutrição e alimentação animal (UFMG) Lattes: http://lattes.cnpq.br/6519538815038307 e-mail:nandodesouza@gmail.com (82)9618-6457 (tim) (82)8113-8781 (vivo) (82)3313-8781 (net) (31)9784-5273 (vivo-MG)
participantes (3)
-
Fernando Souza
-
Rubem Kaipper Ceratti
-
walmes .