【问题标题】:How to create a column based on multiple criteria in r?如何根据 r 中的多个条件创建列?
【发布时间】:2021-03-19 20:21:00
【问题描述】:

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

我认为 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

【问题讨论】:

  • 您可以使用来自dplyrcase_when 做到这一点

标签: r if-statement multiple-conditions


【解决方案1】:

一种方法是使用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

【讨论】:

    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-11
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多