r - 在 x 首先超过 y 的组中过滤

标签 r data.table dplyr

我有一个由

组成的数据库
  • 家庭社区的社区 ID (id_h),
  • 主区 block 的区 block ID (blk_h,
  • 社区的子地理),
  • 工作 block (blk_w),
  • 两者之间的通勤人流(Flow),
  • 每个家庭社区的通勤者中位数 (Med_C),以及
  • 家庭社区的累积 worker 流量 (CumFlow)。

数据按blk_hblk_w之间的距离排序(降序),按id_h分组。我需要对数据进行子集化,以提取 CumFlow FIRST 等于或超过 Med_C 的每个家庭社区的案例。

我尝试了各种 dplyr 功能,但无法使其正常工作。这是一个例子:

df <- data.frame(
  id_h=c("A","A","A","A","B","B","B"),
  blk_h=c("A1","A1","A2","A2","B1","B2","B2"),
  blk_w=c("W1","W2","W3","W3","W1","W2","W2"),
  dist=c(4.3,5.6,7.0,8.7,5.2,6.5,6.8),
  Flow=c(3,6,3,7,5,4,2),
  CumFlow=c(3,9,12,19,5,9,11),
  Med_C=c(10,10,10,10,6,6,6)
)
df

我需要这样返回一个表格:

id_h  blk_h  blk_w  dist  Flow  CumFlow  Med_C
A     A2     W3     7.0   3     12       10
B     B2     W2     6.5   4     9        6

以下是我为实现这一目标所做的一些尝试: 尝试#1

library(dplyr)
df.g <- group_by(df, id_h) 
df.g2 <- filter(df.g, CumFlow == which.min(CumFlow >= Med_C))

尝试 #2

library(data.table)
setDT(df)[, .SD[which.min(CumCount >= Med_C)], by = id_h]

尝试 #3

library(dplyr)
test <- df %>% group_by(id_h) %>% filter(min(CumFlow) >= Med_C)

我想我误解了如何使用 which.min 函数。任何意见是极大的赞赏。

最佳答案

两件事:

  • 你需要 slice(它需要一个索引)而不是 filter(它需要 bool 值),并且
  • 由于 which.min 的用法是奇数(它返回等于最小值的第一个值的索引,并且您有很多 1 和 0),因此您实际上需要 which.max,因为你想要1的第一个值,即TRUE

所以

df %>% group_by(id_h) %>% 
  slice(which.max(CumFlow >= Med_C))
## Source: local data frame [2 x 7]
## Groups: id_h [2]
## 
##     id_h  blk_h  blk_w  dist  Flow CumFlow Med_C
##   <fctr> <fctr> <fctr> <dbl> <dbl>   <dbl> <dbl>
## 1      A     A2     W3   7.0     3      12    10
## 2      B     B2     W2   6.5     4       9     6

关于r - 在 x 首先超过 y 的组中过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837909/

相关文章:

r - 按中位数拆分数据框

r - Dataframe列: Remove quotes,更改小数并变成数字

reshape R : split a column

r - 从数据框转换为数据表时,head(..) 出现错误

r - 查找 data.table 中的列表是否包含其他列中的单词

r - dplyr 中条件的多个组的汇总计数

r - 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

r - 从 R 数据框中选择一系列行

R随机化和随机化数据表的列

r - 在dplyr中突变虚拟变量