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

