You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中筛选仅含Eois相关值的x子集

筛选所有对应y水平均包含"Eois"的x值

问题描述

我有如下R语言数据集:

df <- data.frame(
  x = c("A","A","A","A", "B","B","B","B","B", 
        "C","C","C","C","C","D","D","D","D","D"),  
  y = as.factor(c(rep("Eoissp2",4), rep("Eoissp1",5), "Eoissp1","Eoisp4","Automerissp1","Automerissp2","Acharias", rep("Eoissp2",3), rep("Eoissp1",2)))
)

我需要针对x的每个子集,识别出对应的y中所有水平都包含"Eois"字符串的x值。其中A、B、D应该被返回(它们的y所有取值都包含Eois),而C包含其他类型的取值,不符合要求。期望输出是:

output <- c("A", "B", "D")

解决方案

方法1:用dplyr(tidyverse)实现

如果你习惯使用tidyverse生态的工具,这种方法逻辑清晰,可读性强:

library(dplyr)

output <- df %>%
  group_by(x) %>%
  # 过滤出所有y值都包含"Eois"的分组
  filter(all(grepl("Eois", y))) %>%
  # 提取唯一的x值
  distinct(x) %>%
  pull(x)

# 查看结果
output
#> [1] "A" "B" "D"

代码说明:

  • group_by(x):按x的每个类别进行分组
  • all(grepl("Eois", y)):grepl("Eois", y)会为每个y值生成一个逻辑值(是否包含"Eois"),all()则验证该分组下的所有逻辑值是否都是TRUE——也就是该分组的所有y都符合条件
  • distinct(x) %>% pull(x):提取分组后的唯一x值,得到最终结果

方法2:用Base R实现(无需额外包)

如果不想加载第三方包,用Base R的tapply函数也能快速解决:

# 按x分组,检查每个分组的所有y是否都包含"Eois"
valid_x <- tapply(df$y, df$x, function(y_vals) {
  all(grepl("Eois", y_vals))
})

# 筛选出结果为TRUE的x名称
output <- names(valid_x[valid_x])

# 查看结果
output
#> [1] "A" "B" "D"

代码说明:

  • tapply(df$y, df$x, function(...)):将y列按x的类别分组,对每个分组执行自定义检查
  • 自定义函数里的all(grepl("Eois", y_vals))负责验证该分组的所有y值是否都包含"Eois"
  • 最后从valid_x中筛选出值为TRUE的元素名称,就是我们需要的x值

内容的提问来源于stack exchange,提问作者Danielle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:16:38