请在下面查看我的代码。
我有一个数据框,一个人标识的每个种族都放在一列中(例如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
答案 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个函数以满足ARACE
和AORACE
的条件
# 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)
使用dplyr
和magrittr
软件包,我的最佳版本如下:
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是从其他受该行为迷惑的人那里得到的。