如何在R中创建DAC列:多条件判断及特殊列名处理
问题
需处理包含多种弱势社区(DAC)认定来源的公开数据集,创建名为DAC的新列:只要任意一个认定列符合条件,该列就显示"Yes",否则显示"No"。相关认定列及取值规则如下:
Disadvantaged_Community_OEHHA:值为全大写"YES"或"NO"Disadvantaged_Community_SB535:值为首字母大写"Yes"或"No"DAC(CARB)_LIC(CARB):值为"Low Income and Disadvantaged"或"NA"Disadvantaged_Community_CE53:值为全大写"YES"或"NO"Disadvantaged_Community_CE54:值为全大写"YES"或"NO"
同时疑问:带括号的列名DAC(CARB)_LIC(CARB)是否会有问题?已查到用反引号`可解决,但尝试的代码未成功,最后尝试的代码如下:
clean_transport_2022 <-transform(clean_transport_2022, DAC = ifelse(Disadvantaged_Community_OEHHA == "YES" | Disadvantaged_Community_SB535 == "Yes", `DAC(CARB)_LIC(CARB)` == "Low Income and Disadvantaged" | Disadvantaged_Community_CE53 = "YES" | Disadvantaged_Community_CE54 = "YES", "Yes", "No"))
数据集预览:
> head(clean_transport_2022) # A tibble: 6 × 22 Recipient_Contractor Project_Title Project_Amount Project_Type <chr> <chr> <dbl> <chr> 1 ABAG Bay Area EV … 14533. Electric Ve… 2 CA EV Alliance Bay Area Cha… 12474. Electric Ve… 3 RTC Fuels, LLC dba Pea… Pearson Fuel… 71053 E85 Fueling… 4 Blink Acquisition Nissan Elect… 6849. Electric Ve… 5 Redwood Coast Energy A… North Coast … 70000 Electric Ve… 6 ABAG Bay Area EV … 7266. Electric Ve… # ℹ 18 more variables: Fuel_Type <chr>, Supply_Chain_Phase <chr>, # RDD_D_Phase <chr>, Status <chr>, Project_City <chr>, # Project_Zip <chr>, County <chr>, Air_District <chr>, # Electric_Service_Area <chr>, # Disadvantaged_Community_OEHHA <chr>, # Disadvantaged_Community_SB535 <chr>, Low_Income_SB535 <chr>, # Project_Location <chr>, LowIncome_SB1000 <chr>, …
解决方法
原代码错误点
ifelse参数顺序错误:正确格式为ifelse(条件, 条件为真时的值, 条件为假时的值),你将多个OR条件拆分为参数,导致逻辑混乱。- 条件判断误用赋值符号
=,应使用等于符号==(如Disadvantaged_Community_CE53 = "YES"为错误写法)。 - 多OR条件未合理包裹,逻辑优先级不明确。
正确实现代码
方案1:Base R 写法
clean_transport_2022 <- transform(clean_transport_2022, DAC = ifelse( Disadvantaged_Community_OEHHA == "YES" | Disadvantaged_Community_SB535 == "Yes" | `DAC(CARB)_LIC(CARB)` == "Low Income and Disadvantaged" | Disadvantaged_Community_CE53 == "YES" | Disadvantaged_Community_CE54 == "YES", "Yes", "No" ))
方案2:dplyr 写法(逻辑更清晰)
若习惯使用tidyverse工具,推荐用mutate实现:
library(dplyr) clean_transport_2022 <- clean_transport_2022 %>% mutate(DAC = case_when( Disadvantaged_Community_OEHHA == "YES" | Disadvantaged_Community_SB535 == "Yes" | `DAC(CARB)_LIC(CARB)` == "Low Income and Disadvantaged" | Disadvantaged_Community_CE53 == "YES" | Disadvantaged_Community_CE54 == "YES" ~ "Yes", TRUE ~ "No" ))
带括号列名的处理
你的判断正确:包含特殊字符(括号、空格等)的列名,在R中需用反引号`包裹才能正常调用,上述代码已正确处理DAC(CARB)_LIC(CARB)列。
另外,若DAC(CARB)_LIC(CARB)列的"NA"是缺失值(而非字符串"NA"),可将对应条件改为!is.na(DAC(CARB)_LIC(CARB)),需根据实际数据情况调整。
内容的提问来源于stack exchange,提问作者Julia Caron
相关产品推荐
相关产品推荐

