根据两个条件以及每个条件的多个级别对新变量进行分类

时间:2020-09-28 00:39:40

标签: r

我正在尝试重新编码从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)

2 个答案:

答案 0 :(得分: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. 将一个空的p1raceeth变量与所有NA一起使用。
  3. 其中Hispanic不是NArowSums的其他变量 我们将"unknown"设置为零。
  4. Hispanic1且其他不在mis中的地方,我们有 "Hispanic any race"Hispanic2中的3
  5. 设置"White",其中white1"Black"
  6. 可能存在多个值1的种族变量,我们可能希望将p1raceeth设置为NA(或其他),在{没有rowSums的{​​1}}大于"Hispanic"
  7. (如果需要,我们将所有1设置为NA,但我不这样做 建议这样做,因为它会删除它的信息 "missing",所以我已将其注释掉。)
  8. 最后,我们NA保留了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不会。

如果您需要'factor'变量,则可以选择现在作为最后一步:

%in%

结果

我显示res$p1raceeth <- as.factor(res$p1raceeth) 的唯一行,按res排序。

Hispanic

答案 1 :(得分:-1)

也许,您可以使用 def count_upper_letters(str) """Count upper letters in a string. Input str is a string. Finish this function which counts the number of upper letters in a string. You should do this in a while loop This function returns the number of upper letters in the string as an integer. """ counter=0 while counter == str: if str.upper: counter = counter +1 return counter #test for Q2 print(count_upper_letters(''' Casablanca is a 1942 American romantic drama film directed by Michael Curtiz and based on Murray Burnett and Joan Alison's unproduced stage play Everybody Comes to Rick's print(count_upper_letters("")) / ifelse并使用case_when组合条件:

%in%