如何筛选出包含指定向量元素的数据框观测值?
问题描述
我的向量
day <- c("day", "night")
原始数据
| 观测值 | 第1列 | 第2列 |
|---|---|---|
| 1 | Day | Evening |
| 2 | Evening | Morning |
| 3 | Night | Evening |
| 4 | Morning | Night |
| 5 | Morning | Morning |
| 6 | Night | Day |
需求
如何筛选出至少有一列包含我的向量中任一元素的观测值?
期望结果
| 观测值 | 第1列 | 第2列 |
|---|---|---|
| 1 | Day | Morning |
| 3 | Night | Evening |
| 4 | Morning | Night |
| 6 | Night | Day |
数据框定义
df = data.frame( obs = c(1:6), Column1 = c("Day","Evening","Night","Morning","Morning","Night"), Column2 = c("Evening","Morning","Evening","Night","Morning","Day") )
解决方案
方法1:Base R 实现
注意向量元素是小写,数据中是首字母大写,需要统一大小写后再匹配:
# 统一目标向量的大小写(转为小写) target <- tolower(day) # 逐行检查:将每行的两列转为小写后,是否有元素匹配目标向量 match_rows <- apply(df[, c("Column1", "Column2")], 1, function(row) { any(tolower(row) %in% target) }) # 筛选符合条件的行 result_df <- df[match_rows, ] print(result_df)
方法2:dplyr 包实现(简洁风格)
如果习惯使用tidyverse工具链,可以用dplyr的筛选语法:
library(dplyr) result_df <- df %>% filter( tolower(Column1) %in% tolower(day) | tolower(Column2) %in% tolower(day) ) print(result_df)
两种方法的核心逻辑一致:先统一文本大小写消除匹配差异,再通过%in%判断元素是否在目标向量中,用|(逻辑或)表示至少一列满足条件,最终得到你需要的筛选结果。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

