Unique numbering in the data frame

0

I have a database that contains consumption information per animal and per day. However the animals entered on different days in the experiment. Initially I need to have all animals start counting the days in experiment from 1. Follow part of the base

Animal  Dia Consumo
5       9   2533.96
5       10  2329.06
5       11  2943.79
5       12  3361.62
5       13  2890.82
5       14  2538.98
5       15  2978.81
5       16  3038.76
5       17  3038.76
6       10  2314.82
6       11  2434.75
6       12  2643.99
6       13  2320.58
6       14  2439.56
6       15  2139.6
6       16  2459.54
6       17  2339.59

After this unique numbering for all animals, I need to calculate the mean consumption and standard deviation of all animals each day.

    
asked by anonymous 08.02.2018 / 10:07

1 answer

1

To solve the problem, I'll use the split-apply-combine strategy multiple times with a single statement at a time.

First, we create the column Contagem with the function ave .

dados$Contagem <- ave(dados$Dia, dados$Animal, FUN = function(x) x - x[1] + 1)

The mean and standard deviation are then calculated with tapply .

tapply(dados$Consumo, dados$Contagem, mean)
tapply(dados$Consumo, dados$Contagem, sd)

You can also create new columns in data.frame with these statistics, for this you use the ave function again. This is because even though both ave and tapply do the same calculations the tapply function returns a single value per group while ave returns one value per line from the base. (The values are the same and in the case of ave they are repeated on all rows in the same group.)

dados$Media <- ave(dados$Consumo, dados$Contagem, FUN = mean)
dados$DesvioPadrao <- ave(dados$Consumo, dados$Contagem, FUN = sd)

DATA.

dados <-
structure(list(Animal = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), Dia = c(9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L), 
    Consumo = c(2533.96, 2329.06, 2943.79, 3361.62, 2890.82, 
    2538.98, 2978.81, 3038.76, 3038.76, 2314.82, 2434.75, 2643.99, 
    2320.58, 2439.56, 2139.6, 2459.54, 2339.59)), .Names = c("Animal", 
"Dia", "Consumo"), class = "data.frame", row.names = c(NA, -17L
))
    
08.02.2018 / 15:39