Actualmente tengo una variable "Sexo" que contiene 1 y 2 para hombres y mujeres respectivamente. Quiero agregar ruido aleatorio a esta variable. Por lo tanto, generé números aleatorios usando una distribución normal. El siguiente paso es determinar si algunos de los valores deben cambiar al otro sexo. Utilizo un valor z de 2 y -2 como límites. Entonces, si a un hombre (1) se le asigna un valor> 2, tiene que cambiar a una mujer. También funciona al revés, por lo que cuando se asigna a una mujer (2) un valor z aleatorio de <-2, la variable de sexo tiene que cambiar a hombre (1). En todas las demás opciones, el valor debe seguir siendo el mismo.

Pensé que una declaración ifelse haría el truco. Desafortunadamente, no funcionó. Mi declaración se parece a:

with(Dataset18$New_sex,
     ifelse(Sex== 1 & Norm_dist_random > 2, 2 , ifelse(Sex== 1 & Norm_dist_random <= 2, 1, 
     ifelse(Sex== 2 & Norm_dist_random < -2, 1, ifelse(Sex== 2 & Norm_dist_random >= -2, 2))))
)

Mis datos se ven así:

Sex     Norm_dist_random
 1         0.622221897
 1         2.573726407
 1        -0.298095612
 1         0.717745305
 2        -2.597695772
 2         2.534427904
 2         0.089732903
 2        -0.329274570
 2        -1.173434147

Al final, mis datos tienen que verse como

Sex     Norm_dist_random   Sex_new
 1         0.622221897        1
 1         2.573726407        2
 1        -0.298095612        1
 1         0.717745305        1
 2        -2.597695772        1
 2         2.534427904        2
 2         0.089732903        2
 2        -0.329274570        2
 2        -1.173434147        2
0
Joost 8 dic. 2020 a las 16:47

2 respuestas

La mejor respuesta

Un enfoque es con case_when que permite un conjunto arbitrario de pares de valores de condición lógica. Cada argumento es un lado izquierdo que se evalúa como TRUE o FALSE y un lado derecho que define el valor. Los dos lados están separados por ~.

Las condiciones se prueban en orden hasta que una es TRUE y se asigna ese valor. Agregué TRUE ~ NA_real_ para detectar las filas que no cumplen ninguna condición.

library(dplyr)
Dataset18 %>% 
  mutate(Sex_new = case_when(Sex == 1 & Norm_dist_random <= 2 ~ 1,
                             Sex == 1 & Norm_dist_random > 2 ~ 2,
                             Sex == 2 & Norm_dist_random < -2 ~ 1,
                             Sex == 2 & Norm_dist_random >= -2 ~ 2,
                             TRUE ~ NA_real_))
#  Sex Norm_dist_random Sex_new
#1   1        0.6222219       1
#2   1        2.5737264       2
#3   1       -0.2980956       1
#4   1        0.7177453       1
#5   2       -2.5976958       1
#6   2        2.5344279       2
#7   2        0.0897329       2
#8   2       -0.3292746       2
#9   2       -1.1734341       2
1
Ian Campbell 8 dic. 2020 a las 13:52

También puedes probar esto:

#Code
Dataset18$New_sex <- ifelse(Dataset18$Sex==1 & Dataset18$Norm_dist_random>2,2,
                            ifelse(Dataset18$Sex==2 & Dataset18$Norm_dist_random<(-2),1,Dataset18$Sex))

Salida:

Dataset18
  Sex Norm_dist_random New_sex
1   1        0.6222219       1
2   1        2.5737264       2
3   1       -0.2980956       1
4   1        0.7177453       1
5   2       -2.5976958       1
6   2        2.5344279       2
7   2        0.0897329       2
8   2       -0.3292746       2
9   2       -1.1734341       2

Algunos datos utilizados:

#Data
Dataset18 <- structure(list(Sex = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), Norm_dist_random = c(0.622221897, 
2.573726407, -0.298095612, 0.717745305, -2.597695772, 2.534427904, 
0.089732903, -0.32927457, -1.173434147)), row.names = c(NA, -9L
), class = "data.frame")
1
Duck 8 dic. 2020 a las 14:02