如何根据 r 中的多个条件创建列?

How to create a column based on multiple criteria in r?

目前我有一个变量“Sex”,其中包含分别代表男性和女性的 1 和 2。我想给这个变量添加随机噪声。因此,我使用正态分布生成了随机数。下一步是确定某些值是否必须更改为其他性别。我使用 z 值 2 和 -2 作为边界。所以如果一个男人 (1) 被分配到一个值 >2,它必须改变为一个女人。反之亦然,因此当女性 (2) 被分配给 <-2 的随机 z 值时,性别变量必须更改为男性 (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

一种方法是 case_when,它允许任意一组逻辑条件值对。每个参数的左手边计算结果为 TRUEFALSE,右手边定义值。两侧相隔~.

按顺序尝试条件,直到有一个 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

你也可以试试这个:

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