¿Cómo combinar dos columnas utilizando algunas condiciones?
Sé que esto no es un gran problema, pero soy nuevo en esto. Tengo esta salida obtenida al fusionar dos marcos de datos. Cada uno tiene una columna que corresponde al sexo de cada participante de un evento.
Sex.x | Sex.y |
---|---|
M | M |
F | F |
F | M |
M | M |
F | F |
M | M |
NA | M |
F | F |
Salida deseada: las dos columnas mezcladas en una que tiene “?” cuando sus dos valores no coinciden y que conserva el único valor si hay un NA en la celda adyacente.
F_Sex |
---|
M |
F |
? |
M |
F |
M |
M |
F |
Estaba intentando hacerlo con el paquete dplyr pero solo llego a este código. Sé que necesito usar if_else pero después de muchos intentos, no tengo nada.
all_data1 <- all_data %>% unite(F_sexo, c(sexo.x, sexo.y), sep = "-", remove = TRUE)
Muchas gracias de antemano.
davy.ai
Para crear la salida deseada usando
dplyr
, podemos usar la funciónmutate()
junto conif_else()
. La lógica básica es verificar si los valores en ambas columnas son iguales, si sí, entonces mantener ese valor, de lo contrario, reemplazarlo con"?"
. Además, si hay un valor faltante (NA
) en una columna, simplemente mantener el valor de la otra columna. Así es como podemos implementarlo:“`{r}
library(dplyr)
creación de datos de muestra
df <- data.frame(Sex.x = c(“M”, “F”, “F”, “M”, “F”, “M”, NA, “F”),
Sex.y = c(“M”, “F”, “M”, “M”, “F”, “M”, “M”, “F”))
usar mutate y if_else para crear la columna deseada
df %>%
mutate(F_Sex = if_else(!is.na(Sex.x) & !is.na(Sex.y),
if_else(Sex.x == Sex.y, Sex.x, “?”),
if_else(is.na(Sex.x), Sex.y, Sex.x)))
Sex.x Sex.y F_Sex M M
1 M M M
2 F F F
3 F M ?
4 M M M
5 F F F
6 M M M
7
8 F F F
“`
Aquí, primero verificamos si tanto
Sex.x
comoSex.y
no son faltantes (NA
) usando!is.na()
, luego usamos otra funciónif_else()
para verificar si esos valores son iguales o no. Si son iguales, mantenemos ese valor (Sex.x
en este caso), de lo contrario lo reemplazamos con"?"
. Si alguna de las columnas tiene un valor faltante, luego conservamos el valor de la otra columna usando otra funciónif_else()
. Finalmente, creamos una nueva columna llamadaF_Sex
con los valores modificados usandomutate()
.