如何检查DataFrame中一列字符串是否匹配另一列的缩写形式?
解决方法:检查DataFrame中每行column1的大写字母是否都在column2中
没问题,我来帮你搞定这个需求!你要实现的是对df的每一行,提取column1里的所有大写字母,然后验证这些字母是否全部出现在对应的column2字符串里。下面是具体的实现步骤和代码:
1. 明确核心逻辑
我们需要写一个自定义函数,接收两个参数:每行column1的字符串,以及对应行column2的字符串,核心做两件事:
- 从
column1中提取所有大写字母(用正则表达式[A-Z]匹配所有大写英文字母) - 检查这些提取到的大写字母是否全部存在于
column2中
2. 编写自定义函数
首先加载stringr包(处理字符串的常用工具包),然后定义函数:
library(stringr) check_upper_in_col2 <- function(x, y) { # 提取x中的所有大写字母,转成向量 upper_chars <- str_extract_all(x, "[A-Z]")[[1]] # 如果column1里没有大写字母,直接返回TRUE(没有需要检查的内容,默认符合条件) if (length(upper_chars) == 0) { return(TRUE) } # 逐个检查每个大写字母是否在y中,最后判断是否全部满足 all(str_detect(y, upper_chars)) }
3. 用mapply批量应用函数到两列
mapply可以接收多个向量参数,按元素一一对应传入函数,正好适配DataFrame的两列处理场景:
# 先构造一个示例DataFrame方便测试 df <- data.frame( column1 = c("HeLLo WoRLd", "FooBar", "noUppercase", "XYZ"), column2 = c("abcDEFxyz", "BARfoo", "lowercaseonly", "XY"), stringsAsFactors = FALSE # 确保字符串不会被转成因子 ) # 应用函数并新增结果列 df$all_upper_matched <- mapply(check_upper_in_col2, df$column1, df$column2)
运行后df的结果如下:
| column1 | column2 | all_upper_matched |
|---|---|---|
| HeLLo WoRLd | abcDEFxyz | FALSE |
| FooBar | BARfoo | TRUE |
| noUppercase | lowercaseonly | TRUE |
| XYZ | XY | FALSE |
简单解释结果:
- 第一行:
column1的大写字母包含H、L、W等,但column2只有D、E、F,不匹配所以返回FALSE - 第二行:
column1的大写是F、B,column2里都有,返回TRUE - 第三行:
column1没有大写字母,直接返回TRUE - 第四行:
column1有Z,但column2里没有,返回FALSE
4. 补充:tidyverse风格实现(可选)
如果你习惯用dplyr的管道写法,也可以用rowwise()逐行处理,效果完全一致:
library(dplyr) df <- df %>% rowwise() %>% mutate(all_upper_matched = { upper_chars <- str_extract_all(column1, "[A-Z]")[[1]] if (length(upper_chars) == 0) TRUE else all(str_detect(column2, upper_chars)) }) %>% ungroup()
内容的提问来源于stack exchange,提问作者tmoneyz
相关产品推荐
相关产品推荐

