在R中如何依据字符串是否含1/0来mutate处理apingov列?
解决方案
方法一:针对现有字符串列处理
如果你已经完成分组汇总得到字符串格式的apingov列,可以用dplyr结合stringr包的str_detect()函数实现需求:
library(dplyr) library(stringr) vparty <- vparty %>% mutate( apingov = case_when( # 检测字符串含"1"则赋值为整数1 str_detect(apingov, fixed("1")) ~ 1L, # 检测字符串含"0"则赋值为整数0 str_detect(apingov, fixed("0")) ~ 0L, # 既无1也无0时返回整数类型NA TRUE ~ NA_integer_ ) )
用fixed()是为了精确匹配字符,避免正则表达式的潜在干扰,直接写"1"/"0"也能正常运行。
方法二:优化分组汇总步骤(更高效)
其实不需要先把列转成字符串,在分组汇总阶段就能直接判断组内是否存在1或0,一步得到目标结果,省去后续字符串处理的麻烦:
library(dplyr) vparty <- vparty %>% group_by(country_name, year) %>% summarise( apingov = case_when( # 组内存在1(忽略NA)则赋值为1 any(apingov == 1, na.rm = TRUE) ~ 1L, # 组内存在0(忽略NA)则赋值为0 any(apingov == 0, na.rm = TRUE) ~ 0L, # 都不存在则返回NA TRUE ~ NA_integer_ ), # 取消分组,可根据后续操作需求选择保留或删除 .groups = "drop" )
这个方法直接基于原始数值列判断,避免了字符串转换的额外开销,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者kwalz
相关产品推荐
相关产品推荐

