如何在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
相关产品推荐
相关产品推荐

