我有一个由
组成的数据库- 家庭社区的社区 ID (id_h),
- 主区 block 的区 block ID (
blk_h
, - 社区的子地理),
- 工作 block (
blk_w
), - 两者之间的通勤人流(
Flow
), - 每个家庭社区的通勤者中位数 (
Med_C
),以及 - 家庭社区的累积 worker 流量 (
CumFlow
)。
数据按blk_h
和blk_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/