Average the sum of two columns and division of two columns

Asked

Viewed 45 times

-1

I want to average the sum of 2 columns of the following base:

> dput(head(censo3))
structure(list(UF = c("Rondônia", "Rondônia", "Rondônia", "Rondônia", 
"Rondônia", "Rondônia"), Direção.dos.trabalhos.do.estabelecimento.agropecuário = c("Produtor(a) titular diretamente", 
"Produtor(a) titular diretamente", "Produtor(a) titular diretamente", 
"Produtor(a) titular diretamente", "Produtor(a) titular diretamente", 
"Produtor(a) titular diretamente"), Grupos.de.área.total = c("Mais de 0 a menos de 0,1 ha", 
"Mais de 0 a menos de 0,1 ha", "Mais de 0 a menos de 0,1 ha", 
"Mais de 0 a menos de 0,1 ha", "Mais de 0 a menos de 0,1 ha", 
"Mais de 0 a menos de 0,1 ha"), Utilização.das.terras = c("Lavouras - permanentes", 
"Lavouras - permanentes", "Lavouras - temporárias", "Lavouras - temporárias", 
"Lavouras - área para cultivo de flores", "Pastagens - naturais"
), Utilização.das.terras..1. = c("Lavouras ", "Lavouras ", "Lavouras ", 
"Lavouras ", "Lavouras ", "Pastagens "), Utilização.das.terras..2. = c(" permanentes", 
" permanentes", " temporárias", " temporárias", " área para cultivo de flores", 
" naturais"), Condição.legal.do.produtor = c("Produtor individual", 
"Condomínio, consórcio ou união de pessoas (inclusive casal, quando os dois forem responsáveis pela direção)", 
"Produtor individual", "Condomínio, consórcio ou união de pessoas (inclusive casal, quando os dois forem responsáveis pela direção)", 
"Produtor individual", "Produtor individual"), Nº.dos.estabelecimentos.agropecuários.com.área..Unidade. = c("29", 
"4", "46", "6", "8", "5"), Área.dos.estabelecimentos.agropecuários..hectares. = c("X", 
"X", "X", "X", "X", "X", "50", "40"), Mínimo = c("0", "0", "0", "0", "0", 
"0"), Máximo = c("0,1", "0,1", "0,1", "0,1", "0,1", "0,1")), row.names = c(1L, 
2L, 9L, 10L, 17L, 25L), class = "data.frame")
> 

In which: When the column "Area of establishments" is equal to X, the average will be the sum of the column "Minimum" and Maximum" /2.

When the column "Area of establishments" is equal to a no, the average will be the division of the column "Area of establishments" by column "Number of establishments"

How can I take this average? My data frame has the following structure:

> str(censo3)
'data.frame':   42534 obs. of  11 variables:
 $ UF                                                      : chr  "Rondônia" "Rondônia" "Rondônia" "Rondônia" ...
 $ Direção.dos.trabalhos.do.estabelecimento.agropecuário   : chr  "Produtor(a) titular diretamente" "Produtor(a) titular diretamente" "Produtor(a) titular diretamente" "Produtor(a) titular diretamente" ...
 $ Grupos.de.área.total                                    : chr  "Mais de 0 a menos de 0,1 ha" "Mais de 0 a menos de 0,1 ha" "Mais de 0 a menos de 0,1 ha" "Mais de 0 a menos de 0,1 ha" ...
 $ Utilização.das.terras                                   : chr  "Lavouras - permanentes" "Lavouras - permanentes" "Lavouras - temporárias" "Lavouras - temporárias" ...
 $ Utilização.das.terras..1.                               : chr  "Lavouras " "Lavouras " "Lavouras " "Lavouras " ...
 $ Utilização.das.terras..2.                               : chr  " permanentes" " permanentes" " temporárias" " temporárias" ...
 $ Condição.legal.do.produtor                              : chr  "Produtor individual" "Condomínio, consórcio ou união de pessoas (inclusive casal, quando os dois forem responsáveis pela direção)" "Produtor individual" "Condomínio, consórcio ou união de pessoas (inclusive casal, quando os dois forem responsáveis pela direção)" ...
 $ Nº.dos.estabelecimentos.agropecuários.com.área..Unidade.: chr  "29" "4" "46" "6" ...
 $ Área.dos.estabelecimentos.agropecuários..hectares.      : chr  "X" "X" "X" "X" ...
 $ Mínimo                                                  : chr  "0" "0" "0" "0" ...
 $ Máximo                                                  : chr  "0,1" "0,1" "0,1" "0,1" ...

1 answer

1

Here is a way to do what the question asks, only with R base.

First we make a copy of the base columns that will be processed. And we turn their vectors into numerical vectors, keeping in mind that the decimal places are marked with commas. They must be replaced by points.

tmp <- censo3[(ncol(censo3) - 3):ncol(censo3)]
tmp[] <- lapply(tmp, function(x) as.numeric(sub(",", ".", x)))

Now where were "X" are values NA.
So just use one ifelse to know which pairs of columns the averages will be calculated from.

media <- media <- ifelse(is.na(tmp[[2]]), rowMeans(tmp[3:4]), tmp[[2]]/tmp[[1]])
censo3$media <- media

Finally, the house is made.

rm(tmp, media)
  • Where X is, I also want to calculate the average, however, by the sum of the columns "Maximum" and "Minimum" divided by 2

  • @Ingledmcardoso Yes, that’s what code does.

  • Sorry, I mean that when the column "Area of establishments" is a number, it is being calculated, but not the average. When the column "Area of establishments" is equal to a no, the average will be the division of the column "Area of establishments" by column "Number of establishments"

  • When you have a number in the area column, this adding up area and number of establishments and dividing by 2, as well as when it is X and summing up Minimum and maximum and divided by 2, but in the case where you have a number only the division of the Area column by the Number of establishments column

  • @Ingledmcardoso You’re right, sorry, I hadn’t noticed. Now you’re area.est/num.est.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.