【问题标题】:In R, for a cell that fulfills multiple string conditions在 R 中,对于满足多个字符串条件的单元格
【发布时间】:2020-06-06 16:23:18
【问题描述】:

我对 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 加载我的文件cleaned-demographic-raw_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”值分配给自我识别为相应种族的个人,如果没有,则分配“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-else 语句结合使用,但我担心潜在的重叠或错误识别。我是否可以使用一种方法将多种族但将黑人视为其种族之一(“2”、“3”、“6”)的人分类为“多种族”类别,而将仅识别为黑人的人( "2") 是否会被归类为只识别为黑人的人?

编辑:大家好,我想包含我正在使用的数据的一个子集。有超过 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

我选择前十个结果来证明第 9 个元素确实包含“2”,但它也包含“3”和“7”(个人标识为黑人、西班牙裔/拉丁裔和高加索人)。我想在这里更排外一点,而不是将那个人与那些只识别为黑人的人分组。

【问题讨论】:

  • 嗨,路,为了让社区提供帮助,我们需要一个最小的可重现示例来剪切并粘贴到我们的 R 会话中,这样我们就可以得到同样的错误。您可以使用 dput 提供数据的子集。
  • 您可以发布示例数据吗?请使用dput(DataAll_Analytical) 的输出编辑问题。或者,如果 dput(head(DataAll_Analytical, 20)) 的输出太大。
  • 嗨@mysteRious,我可以使用Pastebin 提供一个小子集吗?
  • 只需执行DataAll_Analytical %&gt;% sample_frac(0.25) %&gt;% dput() -&gt; df 并将它产生的输出复制到上面的问题文本中......而不是 0.25 选择一个百分比,这将产生 10-20 行数据。我们可以复制并粘贴到我们的 R & 将有一个数据框 df 包含您的数据
  • 大家好。我使用了@RuiBarradas,生成的输出是: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")

标签: r csv if-statement


【解决方案1】:

只是为了确保我正确阅读了您的帖子:我认为您想按给定种族/民族对人们进行分类,当且仅当他们报告该种族/民族(并且不是多个类别)。如果是这样,您就在正确的轨道上,但您不需要str_extract - 只需检查给定条目是否等于。例如,您的线路

    DataAll_Analytical$any_black <- ifelse(is.na(str_extract(DataAll_Analytical$eth,"2"))==T,0,1)  

具有将观察 9(报告的种族/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)

如果您想更具体(即有一个列指定特定的方式受访者是多种族/多民族的),您可以以与我建议的第一件事类似的方式对其进行编码.

如果您有任何问题或我误读了您的意图,请告诉我。

【讨论】:

  • 啊,完美。这是我在继续前进之前需要克服的一座小山!作为一个新手和过度思考问题的结合是我的问题。谢谢!
  • 乐于助人!还有一条评论:即使是我的解决方案中的ifelse 也是多余的。如果您只执行DataAll_Analytical$any_black2 &lt;- (DataAll_Analytical$eth == "2") ,请注意这也将执行您想要的操作,因为&lt;- 的右侧将评估为一个 T/F 向量,然后我们可以将其记录在我们的数据框中。这实际上将打印单词TRUEFALSE,它们在后台编码为0 和1,可以毫无问题地转换为您需要的任何内容。 (只是想给你另一种方式来思考如何做到这一点。)
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 2015-11-12
  • 2012-12-04
  • 2018-07-03
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多