具有多个条件的IF语句始终说为true(嵌套在while循环中)

时间:2019-03-23 16:13:20

标签: r

请在下面查看我的代码。

我有一个数据框,一个人标识的每个种族都放在一列中(例如AWHITE,ABLACK等),如果他们标识此种族,则该条目为1(如果不是,则为2)。受访者可以识别多个种族。

我试图确定受访者何时声明他们属于多个种族。如果这样做,我希望将一列(ARACE)更新为91,将另一列(AOTHRACE)更新为2。

if语句(在下面的代码中)始终评估为TRUE。即使这是不正确的。有些受访者只将其识别为一场比赛(即白人)。我已经看过很多次了,但是找不到我搞砸的地方。

我计划在其他种族/栏目中也使用更多的if语句(如果,否则,如果)(即,受访者标识为黑色,并且至少还有其他种族),但我什至无法获得第一个工作,所以我还没有实现。

(我实际上不希望else为0,我只是用来确认代码未按预期工作。当我在ARACE上运行摘要函数时,最小值为91,所以我知道这条语句是从未评估过。)

i <- 0
while (i <= nrow(nhes05v2)){
  if ((nhes05v2$AWHITE == 1) && (any(nhes05v2$ABLACK==1, nhes05v2$AAMIND==1, nhes05v2$AASIAN==1, nhes05v2$APACI==1))){
    nhes05v2$ARACE = 91
    nhes05v2$AOTHRACE = 2}
  else {nhes05v2$ARACE = 0
  nhes05v2$AOTHRACE = 0}
  i <- i+1}

以下是值的示例:

> nhes05v2$AWHITE[1:20]
 [1] 1 1 1 1 1 1 2 2 2 1 1 2 1 1 1 1 1 1 1 1
> nhes05v2$ABLACK[1:20]
 [1] 2 1 2 2 2 2 1 1 1 2 2 1 2 2 2 2 2 2 2 2
> nhes05v2$AASIAN[1:20]
 [1] 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
> nhes05v2$AAMIND[1:20]
 [1] 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2
> nhes05v2$APACI[1:20]
 [1] 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2

我希望输出类似于(这将不仅仅是上面的if语句,还会有更多if, else if,但是由于我坚持第一个还没过去)

> nhes05v2$ARACE[1:20]
 [1] 0 91 0 91 0 91 91 0 0 91 0 0 0 0 0 0 0 0 0 0
> nhes05v2$AOTHRACE[1:20]
 [1] 0 2 0 2 0 2 2 0 0 2 0 0 0 0 0 0 0 0 0 0

当前输出为

> nhes05v2$ARACE[1:20]
 [1] 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91
> nhes05v2$AOTHRACE[1:20]
 [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

2 个答案:

答案 0 :(得分:0)

我们可以通过将2重新编码为0(即0 =“否”)并使用下面的代码和2个用于确定记录是否满足条件的函数来实现此目的。

请注意,代码假定种族变量是数字。

# Replicate your example
AWHITE = as.numeric(unlist(strsplit("1 1 1 1 1 1 2 2 2 1 1 2 1 1 1 1 1 1 1 1", " ")))
ABLACK = as.numeric(unlist(strsplit("2 1 2 2 2 2 1 1 1 2 2 1 2 2 2 2 2 2 2 2", " ")))
AASIAN = as.numeric(unlist(strsplit("2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2", " ")))
AAMIND = as.numeric(unlist(strsplit("2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2", " ")))
APACI = as.numeric(unlist(strsplit("2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2", " ")))

nhes05v2 = data.frame(AWHITE, ABLACK, AASIAN, AAMIND, APACI)
> nhes05v2  # Partial output given
   AWHITE ABLACK AASIAN AAMIND APACI
1       1      2      2      2     2
2       1      1      2      2     2
3       1      2      2      2     2
...
18      1      2      2      2     2
19      1      2      2      2     2
20      1      2      2      2     2

重新编码变量

# Recode variables. Change all 2's to 0's (New coding is 1 = Yes, 0 = No).
nhes05v2[nhes05v2 == 2] = 0

创建2个函数以满足ARACEAORACE的条件

# A person is mixed race it they answer 1 to more than one race
# Therefore a person whose row sum is greater than 1 is mixed race

determine.arace = function(AWHITE, ABLACK, AAMIND, AASIAN, APACI){
  ifelse( sum(AWHITE, ABLACK, AAMIND, AASIAN, APACI ) > 1 , 91, 0)
}

determine.aothrace = function(AWHITE, ABLACK, AAMIND, AASIAN, APACI){
  ifelse( sum(AWHITE, ABLACK, AAMIND, AASIAN, APACI ) > 1 , 2, 0)
}

将这些功能应用于您的数据

ARACE = mapply(determine.arace, nhes05v2$AWHITE, nhes05v2$ABLACK, nhes05v2$AAMIND, nhes05v2$AASIAN, nhes05v2$APACI)
> ARACE
[1]  0 91  0 91  0 91 91  0  0  0  0  0  0 91  0  0  0  0  0  0

AOTHRACE = mapply(determine.aothrace, nhes05v2$AWHITE, nhes05v2$ABLACK, nhes05v2$AAMIND, nhes05v2$AASIAN, nhes05v2$APACI)
> AOTHRACE
[1] 0 2 0 2 0 2 2 0 0 0 0 0 0 2 0 0 0 0 0 0

要将它们添加到您的数据框中

nhes05v2$ARACE = ARACE
nhes05v2$AOTHRACE = AOTHRACE

答案 1 :(得分:0)

使用dplyrmagrittr软件包,我的最佳版本如下:

nhes05v2 %>%
  mutate(ARACE = ifelse(AWHITE == 1 & (ABLACK == 1 | AAMIND ==1 | AASIAN == 1 | APACI == 1), 91, 0),
         AOTHRACE = ifelse(AWHITE == 1 & (ABLACK == 1 | AAMIND ==1 | AASIAN == 1 | APACI == 1), 2, 0))

R中的&&条件仅对照第一行进行检查,这就是为什么您在这里得到结果的原因-here's a post是从其他受该行为迷惑的人那里得到的。