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

在R语言中基于指定列行求和结果筛选DataFrame

嘿,我来帮你搞定这个R数据筛选的问题!先确认下你的数据结构,你给出的这个数据框每个id对应4条观测,想要基于指定列的行求和结果来筛选子集,对吧?下面我给你两种常用的实现方法,你可以根据自己的习惯选:

首先先把你的数据框代码放出来方便复现:

df <- structure( 
  list( 
    id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), 
    time = c(21L, 3L, 4L, 9L, 5L, 9L, 10L, 6L, 27L, 3L, 4L, 10L), 
    gender = c(1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L) 
  ), 
  .Names = c("id", "time", "gender"), 
  class = "data.frame", 
  row.names = c(NA,-12L) 
)

方法1:用dplyr包(代码更直观,推荐)

如果你还没装dplyr,先安装加载:

# 没装的话先运行这句
# install.packages("dplyr")
library(dplyr)

举个例子,假设你要筛选time列按id求和大于40的所有观测行,代码如下:

filtered_df <- df %>%
  group_by(id) %>%          # 按id分组
  mutate(total_time = sum(time)) %>%  # 给每组加一个time总和的辅助列
  filter(total_time > 40) %>%        # 筛选出总和符合条件的行
  ungroup() %>%            # 取消分组,避免影响后续操作
  select(-total_time)      # 可选:删掉辅助列,不需要的话可以去掉这句

# 查看筛选后的结果
filtered_df

要是你想基于gender列的求和来筛选(比如筛选gender总和为4的id,也就是gender全为1的组),只需要把代码里的time换成gender,调整条件就行:

filtered_gender_df <- df %>%
  group_by(id) %>%
  mutate(total_gender = sum(gender)) %>%
  filter(total_gender == 4) %>%
  ungroup() %>%
  select(-total_gender)

方法2:用Base R(不需要额外装包)

如果你不想用第三方包,用R自带的函数也能实现:
还是以筛选time总和大于40的id为例:

# 第一步:计算每个id的time总和
id_time_totals <- aggregate(time ~ id, data = df, sum)

# 第二步:提取符合条件的id列表
valid_ids <- id_time_totals$id[id_time_totals$time > 40]

# 第三步:用id列表筛选原数据框
filtered_df_base <- df[df$id %in% valid_ids, ]

# 查看结果
filtered_df_base

同样,换成gender列的话:

id_gender_totals <- aggregate(gender ~ id, data = df, sum)
valid_gender_ids <- id_gender_totals$id[id_gender_totals$gender == 4]
filtered_gender_base <- df[df$id %in% valid_gender_ids, ]

你只需要把代码里的筛选条件(比如>40、==4)改成你实际需要的规则就可以啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:21