我是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'))
基本上,我两次执行相同的操作,并且我想知道是否有更干净的方法,因为我正在尝试改进语法。我期待您的反馈。
答案 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创建。