我对R有点陌生,我正在使用一个示例数据集来使用ifelse语句来弄脏我的手。在我的Excel电子表格中,基于个人自我识别的方式,在单元格中为列标题为“民族”的类别分配了数值。有相应法规的族裔如下:
1 - Asian
2 - Black or African American
3 - Hispanic or Latino
4 - Native American or American Indian
6 - Native Hawaiian or Pacific Islander
5 - Other (for those who identify with an ethnic group not listed)
7 - Caucasian
8 - Uncertain (for those who are unsure of their ethnicity or what ethnic group they identify with)
9 - Prefer not to answer (chose not to answer)因此,在加载我的文件之后,使用read.csv清除- assigning _data.csv,并将其赋值给变量名"DataAll_Analytical":
DataAll_Analytical <- read.csv(".../Qualtrics_Raw-Clean_2019/cleaned-demographic-raw_data.csv", header = T, na.strings=c("NA"), stringsAsFactors = FALSE)我的目标是在将上面的数值提取为字符串的基础上得到一个具有二进制值的列。值"1“表示”真“,为与相应族裔群体有自我认同的个人分配”1“,如果没有指定值"0”则为假“0”。我目前的做法是:
#Started with 8 and 9 since those were easiest to account for
#returns 1 if the user does not know, 0 for false
DataAll_Analytical$any_dont_know <- ifelse(is.na(str_extract(DataAll_Analytical,"8"))==T,0,1)
#returns 1 if the user did not answer, 0 for false
DataAll_Analytical$no_answer <- ifelse(is.na(str_extract(DataAll_Analytical,"9"))==T,0,1)
# count for asian only
DataAll_Analytical$any_asian <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"1"))==T,0,1)
# count for black only
DataAll_Analytical$any_black <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"2"))==T,0,1)
# count for hispanic only
DataAll_Analytical$any_hispanic <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"3"))==T,0,1)
# count for native_american_only
DataAll_Analytical$any_native_american <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"4"))==T,0,1)
# count for others
DataAll_Analytical$any_other <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"5"))==T,0,1)
# count for those who are only hawaiian/pacific islander
DataAll_Analytical$any_hawaiian_pacific<- ifelse(is.na(str_extract(DataAll_Analytical$eth,"6"))==T,0,1)
# count for those who are only white
DataAll_Analytical$any_white<- ifelse(is.na(str_extract(DataAll_Analytical$eth,"7"))==T,0,1)然而,我想说明的个人谁被认为是多种族。这意味着一个指定他们是黑人、白种人和亚洲人的人会有对应的单元格的字符串组合"1,2,7“。至于被认定为多种族的个人,我想把他们作为一个单独的群体,而不是与其他预先确定的族裔群体重叠。
我考虑过在这个方法中使用字符串提取,同时结合if- for语句,但我担心潜在的重叠或错误识别。我是否可以用一种方法将一个多种族的人("2“、"3”、"6")归类为“多种族”类,而那些只认定为黑人的人("2")会被归类为只属于黑人的人?
编辑: Hi all,我想包含我正在处理的数据的一个子集。有超过237个条目,所以我从dput(head(DataAll_Analytical, 20))获得了这个输出
structure(list(eth = c("7", "7", "7", "2", "7", "7", "7", "5",
"2,3,7", "2", "2", "2", "2", "2", "2", "7", "7", "7", "2", "2"
)), .Names = "eth", row.names = c(NA, 20L), class = "data.frame")编辑2:作为二进制值的输出示例,我为标识为黑色的参与者提供了这样的示例:
> DataAll_Analytical$any_black <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"2"))==T,0,1) # count for black only
> print(head(DataAll_Analytical$any_black, 10))
[1] 0 0 0 1 0 0 0 0 1 1我选择了前10个结果来证明第9个元素确实包含一个"2",但也包含"3“和"7”(个人识别为黑人、西班牙裔/拉丁裔和高加索人)。我想在这里更加排他性一点,而不是把那个人和那些只认定为黑色的人分组。
发布于 2020-06-06 18:08:43
为了确保我正确地阅读了你的文章:我认为你想按给定的种族/族裔来分类,如果并且只有当他们只报告那个种族/族裔(而不是多个类别)的时候。如果是这样的话,您是在正确的轨道上,但您不需要一个str_extract -只需检查给定的条目是否等于某一项。例如,你的线路
DataAll_Analytical$any_black <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"2"))==T,0,1) 具有将观察9(报告的race/eth 2, 3, 7)分为三类的效果。为了阻止这种情况的发生,请尝试如下
DataAll_Analytical$any_black2 <- ifelse(DataAll_Analytical$eth == "2",1,0) 以及其他线路的类似替代物。特别要注意的是,我在ifelse上切换了1和0的位置。其逻辑是:扫描列,并检查内容是否精确为"2“,而没有其他内容。根据是否满足条件,==操作符将具有记录T和F值的效果。您可以验证此列(称为any_black2)与您仅在观察9中构造的列不同,这也是一种更简单的编写代码的方法,它将更容易阅读并不会抛出警告消息。
因此,问题是如何处理多种族/多族裔的条目。听起来,您只想创建一个新列来表示它们;注意,它们是通过在条目中添加逗号来标识的。以你开始的方式做某事:
DataAll_Analytical$multi <- ifelse(is.na(str_extract(DataAll_Analytical$eth, ",")), 0, 1)如果您想要更具体(即有一列列指定应答者是多种族/多民族的),您可以将其编码为与我建议的第一件事类似的方式。
如果你有问题或者我误解了你的意图,请告诉我。
https://stackoverflow.com/questions/62234621
复制相似问题