0

目前我有一个变量“Sex”,其中分别包含男性和女性的 1 和 2。我想向这个变量添加随机噪声。因此,我使用正态分布生成随机数。下一步是确定某些值是否必须更改为其他性别。我使用 z 值 2 和 -2 作为边界。因此,如果一个男人 (1) 的值大于 2,则它必须更改为一个女人。它也适用于相反的方式,因此当女性 (2) 被分配到随机 z 值 <-2 时,性别变量必须更改为男性 (1)。在所有其他选项中,该值必须保持不变。

我认为 ifelse 语句可以解决问题。不幸的是,它没有用。我的陈述如下:

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))))
)

我的数据看起来像:

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

最后我的数据必须看起来像

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
4

2 回答 2

1

一种方法是case_when允许任意一组逻辑条件值对。每个参数都是一个评估为TRUEor的左侧FALSE和一个定义值的右侧。两侧由 隔开~

按顺序尝试条件,直到一个是TRUE并且该值被分配。我添加TRUE ~ NA_real_以捕获不满足任何条件的行。

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
于 2020-12-08T13:52:58.667 回答
1

你也可以试试这个:

#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))

输出:

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

使用的一些数据:

#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")
于 2020-12-08T14:02:00.123 回答