【问题标题】:categorizing a new variable based on two conditions and multiple levels per condition根据两个条件和每个条件的多个级别对新变量进行分类
【发布时间】:2020-09-28 00:39:40
【问题描述】:

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

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

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)

【问题讨论】:

    标签: r


    【解决方案1】:

    我建议将缺失的代码编码为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. 跨越一个空的p1raceeth 变量与所有NA
    3. 其中Hispanic 不是NArowSums 的其他变量 是零,我们设置"unknown"
    4. 其中Hispanic1 而其他不在mis 中,我们有 "Hispanic any race"Hispanic 对应 23
    5. 设置"White",其中white1"Black" 相应地。
    6. 可能存在多个值为1 的竞争变量,我们可能希望将那些p1raceeth 设置为NA(或其他东西),可识别rowSums w/o @ 987654347@ 大于 1
    7. (如果我们愿意,我们将所有NA 设置为"missing",但我没有 推荐这个,因为它会删除它的信息 NA,所以我已经注释掉了。)
    8. 最后,我们rmove 将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)
    

    结果

    我展示了result 的唯一行,按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>
    

    【讨论】:

      【解决方案2】:

      也许,您可以使用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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-29
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 2020-04-04
        相关资源
        最近更新 更多