如何用R筛选出至少一个分组行和大于0.5的数据框行
R语言筛选满足条件的行
先定义你提供的数据:
df <- data.frame( sample1 = c(0, 1, 2, 0, 2, 1), sample2 = c(0.3, 3, 2, 0.4, 2, 3), sample3 = c(0.2, 1, 3, 0.1, 3, 3), sample4 = c(0.4, 2, 4, 0.3, 1, 1), sample5 = c(0.1, 2, 4, 0.2, 5, 3), sample6 = c(0.2, 3, 1, 0.1, 6, 3), sample7 = c(0.2, 1, 1, 0.4, 1, 1) ) groups <- data.frame( samples = c("sample1", "sample2", "sample3", "sample4", "sample5", "sample6", "sample7"), groups = c("group1", "group1", "group1", "group2", "group2", "group3", "group3") )
要筛选出至少有一个分组中存在大于0.5数值的行,以下是两种常用实现方法:
方法一:Base R 实现
先按分组归类列名,再逐行检查每个分组是否有符合条件的值:
# 按分组把列名归类 group_cols <- split(groups$samples, groups$groups) # 筛选每行:只要任意一个分组里有大于0.5的值就保留 filtered_df <- df[apply(df, 1, function(row) { any(sapply(group_cols, function(cols) any(row[cols] > 0.5))) }), ] # 查看结果 filtered_df
运行后得到目标结果:
sample1 sample2 sample3 sample4 sample5 sample6 sample7 2 1 3 1 2 2 3 1 3 2 2 3 4 4 1 1 5 2 2 3 1 5 6 1 6 1 3 3 1 3 3 1
方法二:Tidyverse 风格实现
用dplyr和tidyr处理,适合习惯 tidy 语法的用户:
library(dplyr) library(tidyr) filtered_df <- df %>% # 给每行加唯一标识 mutate(row_id = row_number()) %>% # 转成长格式方便合并分组信息 pivot_longer(-row_id, names_to = "samples", values_to = "value") %>% # 合并分组信息 left_join(groups, by = "samples") %>% # 按行和分组判断是否有大于0.5的值 group_by(row_id, groups) %>% summarise(has_over = any(value > 0.5), .groups = "drop_last") %>% # 判断该行是否至少有一个分组符合条件 summarise(keep = any(has_over), .groups = "drop") %>% # 筛选要保留的行 filter(keep) %>% # 合并回原数据并去掉行标识 select(row_id) %>% left_join(df %>% mutate(row_id = row_number()), by = "row_id") %>% select(-row_id) filtered_df
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

