首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有条件地聚合不包含某些值的dataframe行

有条件地聚合不包含某些值的dataframe行
EN

Stack Overflow用户
提问于 2019-11-25 14:20:57
回答 1查看 33关注 0票数 0

在df中,我希望只保留那些intersect_streetstreets中包含的街道名称相匹配的行,同时还将删除行的intersection_distance_meters添加到其上面的行。

df

代码语言:javascript
复制
> streets
[1] "FRONT ST" "2ND ST"   "3RD ST"   "4TH ST"  

> df
              intersection segment_key intersection_distance_meters intersect_street
1       ARCH ST & FRONT ST         1EW                           81         FRONT ST
2     ARCH ST & MASCHER ST         2EW                           60       MASCHER ST
3         ARCH ST & 2ND ST         3EW                           57           2ND ST
4 ARCH ST & LITTLE BOYS CT         4EW                           28   LITTLE BOYS CT
5       ARCH ST & BREAD ST         5EW                           83         BREAD ST
6         ARCH ST & 3RD ST         6EW                          135           3RD ST
7         ARCH ST & 4TH ST         7EW                          144           4TH ST

期望输出

代码语言:javascript
复制
              intersection segment_key intersection_distance_meters intersect_street
1       ARCH ST & FRONT ST         1EW                          141         FRONT ST
2         ARCH ST & 2ND ST         3EW                          168           2ND ST
3         ARCH ST & 3RD ST         6EW                          135           3RD ST
4         ARCH ST & 4TH ST         7EW                          144           4TH ST

我一直在使用dplyr中的lead()将下一行的intersect_streetintersection_distance_meters添加为新列,然后有条件地对它们进行加和,但是当一行中有多个非主交叉点(例如,上面的第4行和第5行)时,我遇到了问题。

数据

代码语言:javascript
复制
df <- structure(list(intersection = c("ARCH ST & FRONT ST", "ARCH ST & MASCHER ST", 
"ARCH ST & 2ND ST", "ARCH ST & LITTLE BOYS CT", "ARCH ST & BREAD ST", 
"ARCH ST & 3RD ST", "ARCH ST & 4TH ST"), segment_key = c("1EW", 
"2EW", "3EW", "4EW", "5EW", "6EW", "7EW"), intersection_distance_meters = c(81, 
60, 57, 28, 83, 135, 144), intersect_street = c("FRONT ST", "MASCHER ST", 
"2ND ST", "LITTLE BOYS CT", "BREAD ST", "3RD ST", "4TH ST")), row.names = c(NA, 
7L), class = "data.frame")

streets <- c("FRONT ST", "2ND ST", "3RD ST", "4TH ST")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-25 14:30:23

我想这就是你想要的。我创建了一些额外的助手列--我把它们放在其中,这样逻辑就清楚了。

代码语言:javascript
复制
df %>% mutate(
    keep = intersect_street %in% streets,
    grouper = cumsum(keep)
  ) %>%
  group_by(grouper) %>%
  mutate(total_intersection_dist = sum(intersection_distance_meters)) %>%
  slice(1)
# # A tibble: 4 x 7
# # Groups:   grouper [4]
#   intersection       segment_key intersection_distance_met~ intersect_street keep  grouper total_intersection_di~
#   <chr>              <chr>                            <dbl> <chr>            <lgl>   <int>                  <dbl>
# 1 ARCH ST & FRONT ST 1EW                                 81 FRONT ST         TRUE        1                    141
# 2 ARCH ST & 2ND ST   3EW                                 57 2ND ST           TRUE        2                    168
# 3 ARCH ST & 3RD ST   6EW                                135 3RD ST           TRUE        3                    135
# 4 ARCH ST & 4TH ST   7EW                                144 4TH ST           TRUE        4                    144
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59033918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档