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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:33