如何根据 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
,它允许任意一组逻辑条件值对。每个参数的左手边计算结果为 TRUE
或 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
你也可以试试这个:
#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")
目前我有一个变量“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
,它允许任意一组逻辑条件值对。每个参数的左手边计算结果为 TRUE
或 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
你也可以试试这个:
#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")