Create new columns of data in a data frame

Asked

Viewed 52 times

3

I would like to create 2 new columns in my "Minimum" and "Maximum" date frame, where the value of these columns depends on the "Total area groups" column, where for example, when "Total area groups"= "More than 0 to less than 0.1 ha, the "Minimum" column should be 0 and the "Maximum" column" equal to 0,1 ha.

See the result of dput(head(census 2):

    dput(head(censo2))
    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","De 0,2 a menos de 0,5 ha", "De 0,5 a menos de 1 ha", "De 1 a menos de 2 ha", "De 3 a menos de 4 ha", "De 1 a menos de 2 ha", "De 2 a menos de 3 ha", "De 3 a menos de 4 ha", "De 5 a menos de 10 ha", "De 4 a menos de 5 ha", "De 10 a menos de 20 ha", "De 20 a menos de 50 ha", "De 50 a menos de 100 ha", "De 100 a menos de 200 ha", "De 200 a menos de 500 ha", "De 500 a menos de 1.000 ha", "De 1.000 a menos de 2.500 ha", "De 2.500 a menos de 10.000 ha", "De 10.000 ha e mais"), `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")), row.names = c(1L, 2L, 9L, 10L, 17L, 
    25L), class = "data.frame")
  • And the column Máximo must be equal to the string "0,1ha"? And when the column Grupos de área total nay is equal to that value? Mínimo and Máximo are equal to NA or to what?

  • yes, minimum=0 and maximum= 0,1 ha

  • Report the result of the Unique command(census 2$Grupos de área total), so that we can see the different values of the variable.

2 answers

3

You must first create the two variables:

censo2$Minimo <- NA
censo2$Maximo <- NA

There are a few ways to apply the condition you want. A clear (maybe not the fastest) way is through a for loop.

for(i in 1:nrow(censo2)) {
  if(censo2$`Grupos de área total`[i] == "Mais de 0 a menos de 0,1 ha") {
    censo2$Minimo[i] <- "0"
    censo2$Maximo[i] <- "0,1 ha"
  } else {
    censo2$Minimo[i] <- "???"
    censo2$Maximo[i] <- "???"
  }
}

You reported that when the value of the variable Total area groups is equal to More than 0 to less than 0,1 ha, the variable Minimum must take on the value 0 and the variable Maximum must take on the value 0,1 ha, however, you did not say what happens to them when this condition is false. In the code above, they will receive the value ???, but you can change as needed. If the intention is to keep the In, just remove the Else instruction, as the example below:

for(i in 1:nrow(censo2)) {
  if(censo2$`Grupos de área total`[i] == "Mais de 0 a menos de 0,1 ha") {
    censo2$Minimo[i] <- "0"
    censo2$Maximo[i] <- "0,1 ha"
  } 
}

If you want to include multiple conditions, just add new "Else if", see the example:

for(i in 1:nrow(censo2)) {
  if(censo2$`Grupos de área total`[i] == "Mais de 0 a menos de 0,1 ha") {
    censo2$Minimo[i] <- "0 ha"
    censo2$Maximo[i] <- "0,1 ha"
  } else if(censo2$`Grupos de área total`[i] == "De 0,1 a menos de 0,2 ha") {
    censo2$Minimo[i] <- "0,1 ha"
    censo2$Maximo[i] <- "0,2 ha"
  } else if(censo2$`Grupos de área total`[i] == "De 3 a menos de 4 ha") {
    censo2$Minimo[i] <- "3 ha"
    censo2$Maximo[i] <- "4 ha"
  }
}

I could suggest a more dynamic way, but for that I would need to know better your dataset.

  • I’d take the bouquet off else, the value NA can be processed by R much more naturally.

  • I purposely placed Isis so that she can assign the desired condition.

  • My database is very large, so it did not appear all variables of the column "Total area group", as I have other values like "From 0.1 to less than 0.2 ha", "From 3 to less than 4 ha", how can I put them in this command?

  • @Ingledseiévini And what do you want to do with these new values? It is best to edit the question with this information.

  • I edited, I put all the values in the column

  • @Ingledseiévini, I added an example with multiple conditions.

Show 1 more comment

1

You can do what the question asks in the following fully vectorized way.
This way uses the package stringi.

library(stringi)

censo2$Minimo <- NA
censo2$Maximo <- NA
grupos <- unique(censo2[['Grupos de área total']])

Min <- stri_extract_first(grupos, regex = "[[:digit:]\\.,]+")
Max <- ifelse(grepl('menos', grupos),
              stri_extract_last(grupos, regex = "[[:digit:]\\.,]+"),
              "mais"
              )
i <- match(censo2[['Grupos de área total']], grupos)
censo2$Minimo <- Min[i]
censo2$Maximo <- Max[i]

Browser other questions tagged

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