【发布时间】: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 %>% group_by(col1, MyLength, col3) %>% summarise(MinPOS = min(POS), MaxPOS = max(POS)) -
嘿,罗纳克,谢谢。我注意到您在@Callum 之前回答了(感谢两者)。愿意将您的评论作为答案,以便我可以接受,因为您是第一个?
-
其实这个问题之前有人问过,我已经把它标记为重复了。你可以接受 Calum 的回答。