使用dplyr进行子集/过滤-改善我的语法

时间:2018-09-28 18:35:23

标签: r dplyr

我是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'))

基本上,我两次执行相同的操作,并且我想知道是否有更干净的方法,因为我正在尝试改进语法。我期待您的反馈。

1 个答案:

答案 0 :(得分:2)

您应该使用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-09-28创建。

相关问题