i have database consisting of
- neighborhood ids home neighborhoods (id_h),
- block ids home blocks (
blk_h
, - a sub-geography of neighborhoods),
- work blocks (
blk_w
), - the flow of commuters between 2 (
flow
), - the median commuter per home neighborhood (
med_c
), and - the cumulative worker flow home neighborhood (
cumflow
).
the data sorted distance between blk_h
, blk_w
(descending), grouped id_h
. need subset data extract case each home neighborhood cumflow
first equals or exceeds med_c
.
i've tried variety of dplyr functions , cannot work. here's example:
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
i need return table this:
id_h blk_h blk_w dist flow cumflow med_c a2 w3 7.0 3 12 10 b b2 w2 6.5 4 9 6
and here of things i've tried make happen: attempt #1
library(dplyr) df.g <- group_by(df, id_h) df.g2 <- filter(df.g, cumflow == which.min(cumflow >= med_c))
attempt #2
library(data.table) setdt(df)[, .sd[which.min(cumcount >= med_c)], = id_h]
attempt #3
library(dplyr) test <- df %>% group_by(id_h) %>% filter(min(cumflow) >= med_c)
i think misunderstanding how use which.min
function. advice appreciated.
two filter
calls can solve this.
using group_by
work within each id_h
, first filter
returns data.frame
rows cumflow
greater or equal med_c
. second filter
returns, within each id_h
, row lowest cumflow
. works because data sorted. make work more robust may consider adding call arrange
after call group_by
.
library(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 df %>% group_by(id_h) %>% filter(cumflow >= med_c) %>% filter(cumflow == min(cumflow))
Comments
Post a Comment