【问题标题】:Subsetting/filtering with dplyr - improving my syntax [duplicate]使用 dplyr 进行子集化/过滤 - 改进我的语法 [重复]
【发布时间】:2018-09-28 18:35:22
【问题描述】:

我是 dplyr 的新手,正在尝试改进我的语法。我有以下数据框:

testdf5<- data.frame(
  stringsAsFactors = FALSE,
  col1=c('aa', 'aa', 'aa', 'bb', 'bb', 'bb', 'cc','cc','cc'),
  MyLength=c('500', '500', '600', '500', '600', '600', '700','700','600'),
  col3=c('0.5', '0.5', '0.5', '0.5', '0.5', '0.5', '0.5','0.7','0.7'),
  POS=c(
    500, 1000, 2000,
    400, 500, 600,
    10000, 10500, 11000))

我想:

1) 按 col1、Mylength 和 col3 对行进行分组;

2) 对于每个组,我想要最小和最大 POS

这是我想要的结果:

col1 MyLength col3 MinPos    MaxPOS  
aa      500   0.5    500     1000  
aa      600   0.5   2000     2000  
bb      500   0.5    400      400  
bb      600   0.5    500      600  
cc      600   0.7  11000     11000 
cc      700   0.5  10000     10000 
cc      700   0.7  10500     10500 

这是我的代码,有效:

testdf6<- testdf5 %>%
  #needs '.dots' to read a character vector
  dplyr::group_by(.dots=c('col1', 'MyLength', 'col3')) %>%
  dplyr::filter(POS==min(POS)) ##get min(POS)
colnames(testdf6)[4] <- 'MinPos'

testdf7<- testdf5 %>%
  #needs '.dots' to read a character vector
  dplyr::group_by(.dots=c('col1', 'MyLength', 'col3')) %>%
  dplyr::filter(POS==max(POS)) ##Get max(POS)
# 
 colnames(testdf7)[4] <- 'MaxPos'
#Now merge
testdf8<- merge(testdf6, testdf7, by = c('col1',  'MyLength', 'col3'))

我基本上做了两次相同的操作,我想知道是否有更清洁的方法,因为我正在尝试改进我的语法。我期待您的反馈。

【问题讨论】:

  • testdf5 %&gt;% group_by(col1, MyLength, col3) %&gt;% summarise(MinPOS = min(POS), MaxPOS = max(POS))
  • 嘿,罗纳克,谢谢。我注意到您在@Callum 之前回答了(感谢两者)。愿意将您的评论作为答案,以便我可以接受,因为您是第一个?
  • 其实这个问题之前有人问过,我已经把它标记为重复了。你可以接受 Calum 的回答。

标签: r dplyr


【解决方案1】:

您应该使用summarise 来计算这样的统计信息,并且您可以一次计算多个不同的统计信息:

library(tidyverse)
testdf5<- data.frame(
  stringsAsFactors = FALSE,
  col1=c('aa', 'aa', 'aa', 'bb', 'bb', 'bb', 'cc','cc','cc'),
  MyLength=c('500', '500', '600', '500', '600', '600', '700','700','600'),
  col3=c('0.5', '0.5', '0.5', '0.5', '0.5', '0.5', '0.5','0.7','0.7'),
  POS=c(
    500, 1000, 2000,
    400, 500, 600,
    10000, 10500, 11000))

testdf5 %>%
  group_by(col1, MyLength, col3) %>%
  summarise(MinPos = min(POS), MaxPos = max(POS))
#> # A tibble: 7 x 5
#> # Groups:   col1, MyLength [?]
#>   col1  MyLength col3  MinPos MaxPos
#>   <chr> <chr>    <chr>  <dbl>  <dbl>
#> 1 aa    500      0.5      500   1000
#> 2 aa    600      0.5     2000   2000
#> 3 bb    500      0.5      400    400
#> 4 bb    600      0.5      500    600
#> 5 cc    600      0.7    11000  11000
#> 6 cc    700      0.5    10000  10000
#> 7 cc    700      0.7    10500  10500

reprex package (v0.2.0) 于 2018 年 9 月 28 日创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多