1

我正在尝试重新编码从一个Hispanic变量和 6 个其他变量派生的种族/民族race变量。

我已经尝试了其中一些方法。我不太清楚如何为每个因素保持所有不同的水平。

Hispanic变量有 5 个级别:0:NA, 1:yes, 2:no, 3:unable to determine, 99:missing

每个race变量有 3 个级别:0:does not apply, 1:applies, 99:missing.

我的新p1raceeth变量将有 7 个级别:0:Unknown, 1:Black,NH, 2:Hispanic any race, 3:Other, 4:White,NH, 99:missing.

我也尝试过使用下面的代码对其进行编码,它适用于一个race:amakn变量,但是当我race使用相同的代码继续下一个变量时,它会覆盖过去的重新编码。任何建议都会非常有帮助。包括有关如何折叠raceHispanic变量中的因子水平以使其更易于管理的建议。

促使这一点的原因是我试图asiannhopi. 真是个兔子洞。

d_a$p1raceeth <- "0"
d_a$p1raceeth[d_a$Hispanic=="0" & d_a$amakn=="0"] <- "0"
d_a$p1raceeth[d_a$Hispanic=="0" & d_a$amakn=="1"] <- "0"
d_a$p1raceeth[d_a$Hispanic=="0" & d_a$amakn=="99"] <- "0"

d_a$p1raceeth[d_a$Hispanic=="1" & d_a$amakn=="0"] <- "2"
d_a$p1raceeth[d_a$Hispanic=="1" & d_a$amakn=="1"] <- "2"
d_a$p1raceeth[d_a$Hispanic=="1" & d_a$amakn=="99"] <- "99"

d_a$p1raceeth[d_a$Hispanic=="2" & d_a$amakn=="0"] <- "99"
d_a$p1raceeth[d_a$Hispanic=="2" & d_a$amakn=="1"] <- "3"
d_a$p1raceeth[d_a$Hispanic=="2" & d_a$amakn=="99"] <- "99"

d_a$p1raceeth[d_a$Hispanic=="3" & d_a$amakn=="0"] <- "0"
d_a$p1raceeth[d_a$Hispanic=="3" & d_a$amakn=="1"] <- "3"
d_a$p1raceeth[d_a$Hispanic=="3" & d_a$amakn=="99"] <- "99"

d_a$p1raceeth[d_a$Hispanic=="99" & d_a$amakn=="0"] <- "99"
d_a$p1raceeth[d_a$Hispanic=="99" & d_a$amakn=="1"] <- "3"
d_a$p1raceeth[d_a$Hispanic=="99" & d_a$amakn=="99"] <- "99"

这是我的数据示例:

df <- read.table(text=
"Hispanic amakn asian blkaa nhopi white utod
1           1          0          0          0          0          1         0
2           2         99         99          1         99         99        99
3          99         99         99         99         99         99        99
4           3         99         99         99         99         99        99
5           0         99         99         99         99         99        99
6          99         99         99         99         99         99        99
7           3         99         99         99         99         99        99
8           0         99         99         99         99         99        99
9           2          0          0          0          0          1         0
10          2          0          0          0          0          1         0
11          2          0          0          0          0          1         0
12          1          0          0          0          0          1         0
13          0         99         99         99         99         99        99
14          2          0          0          0          0          1         0
15          0         99         99         99         99         99        99
16          2          0          0          0          0          1         0
17          2          0          0          1          0          0         0
18          0          0          0          0          0          0         0
19         99         99         99         99         99         99        99
20          1         99         99         99         99         99        99
21          0         99         99         99         99         99        99
22          2          0          0          0          0          1         0
23          2          0          0          0          0          1         0
24          2          0          0          1          0          0         0
25          0         99         99         99         99         99        99
26         99          0          0          0          0          1         0
27          0         99         99         99         99         99        99
28         99          0          0          0          0          1         0
29          1         99         99         99         99         99        99
30         99         99         99         99         99         99        99
31          2          0          0          0          0          1         0
32          2          0          0          0          0          1         0
33          3          0          1          0          0          0         0
34          2         99         99         99         99          1        99
35          2          0          0          0          0          1         0
36          1         99         99         99         99         99        99
37          0         99         99         99         99         99        99
38          2          0          0          0          0          1         0
39         99         99         99         99         99         99        99
40          1         99         99         99         99         99        99
", header=TRUE)
4

2 回答 2

2

我建议将缺失编码为NA使生活更轻松。

d_a[] <- lapply(d_a, function(x) {x[x %in% 99] <- NA;x})
d_a$Hispanic[d_a$Hispanic %in% 0] <- NA

然后,使用within,我们一一浏览选项。

  1. 创建索引变量mis,用于标识所有竞态变量所在的行NA
  2. 使用 all跨越一个空p1raceeth变量NA
  3. 我们设置的地方Hispanic不是NArowSums其他变量为零"unknown"
  4. 哪里Hispanic1,别人不在mis,我们有 "Hispanic any race"Hispanic23相应地。
  5. 相应地设置, "White"where whiteis in 。1"Black"
  6. 可能存在多个值为 的竞赛变量1,我们可能希望将它们设置p1raceethNA(或其他),可识别rowSumsw/o"Hispanic"大于 的位置1
  7. (如果我们愿意,我们将 all 设置NA"missing",但我不建议这样做,因为它会删除它的信息 NA,所以我已将其注释掉。)
  8. 最后,我们rm忽略了mis变量,以免出现在结果中。

res <- within(d_a, {
  mis <- apply(d_a[-1], 1, function(x) all(is.na(x)))
  p1raceeth <- NA
  p1raceeth[is.na(Hispanic) & rowSums(d_a[-1]) %in% 0] <- "unknown"
  p1raceeth[Hispanic %in% 1 & !mis] <- "Hispanic any race"
  p1raceeth[Hispanic %in% 2:3 & !mis] <- "Other"
  p1raceeth[Hispanic %in% 2 & white %in% 1] <- "White"
  p1raceeth[Hispanic %in% 2 & blkaa %in% 1] <- "Black"
  p1raceeth[rowSums(d_a[-1], na.rm=T) > 1] <- NA
  # p1raceeth[is.na(p1raceeth)] <- "missing"
  rm(mis)
})

请注意,%in%在这里使用了(可能更熟悉的)==。这很重要,因为==偶尔会产生NA我们不想要的东西,而%in%不会。

如果您需要一个“因子”变量,您可以选择现在作为最后一步:

res$p1raceeth <- as.factor(res$p1raceeth)

结果

我显示了 ult 的唯一行res,按Hispanic.

unique(res[order(res$Hispanic), ])
#    Hispanic amakn asian blkaa nhopi white utod         p1raceeth
# 1         1     0     0     0     0     1    0 Hispanic any race
# 20        1    NA    NA    NA    NA    NA   NA              <NA>
# 2         2    NA    NA     1    NA    NA   NA             Black
# 9         2     0     0     0     0     1    0             White
# 17        2     0     0     1     0     0    0             Black
# 34        2    NA    NA    NA    NA     1   NA             White
# 4         3    NA    NA    NA    NA    NA   NA              <NA>
# 33        3     0     1     0     0     0    0             Other
# 3        NA    NA    NA    NA    NA    NA   NA              <NA>
# 18       NA     0     0     0     0     0    0           unknown
# 26       NA     0     0     0     0     1    0              <NA>
于 2020-09-28T07:10:53.150 回答
-1

也许,您可以使用ifelse/case_when并使用以下组合条件%in%

library(dplyr)

df %>%
  mutate(p1raceeth = case_when(Hispanic== 0 & amakn %in% c(0, 1, 99) ~ 0, 
                               Hispanic== 1 & amakn %in% c(0, 1) ~ 2, 
                               Hispanic %in% c(2, 3) & amakn == 1 ~ 3,
                               Hispanic == 3 & amakn == 0 ~ 0,
                               Hispanic == 99 & amakn == 1~ 3,
                               TRUE ~ 99))
于 2020-09-28T00:54:25.013 回答