将其他变量添加到dplyr汇总

时间:2015-11-03 15:56:22

标签: r dplyr

我有一个数据框,我想通过变量(a,在下面的示例中)进行分组,并总结另一个变量的最大值(b,在下面的示例中)。另外,我想打印对应于最大观察值的第三个(c,在下面的例子中)变量的值。我的代码在某些情况下有效但如果变量c对于组内的所有观察都是NA,则返回错误。有没有简单的方法来解决这个问题?

library(dplyr)
mydf<-data.frame(a=c(1,1,2,3,4,4),b=c("car","banana","phone","computer","ipod","phone"),c=c(7,2,3,4,9,8))
mydf
group_by(mydf,a) %>% summarise(max(c),b[which.max(c)])

mydf<-data.frame(a=c(1,1,2,3,4,4),b=c("car","banana","phone","computer","ipod","phone"),c=c(7,2,3,4,NA,NA))
mydf
group_by(mydf,a) %>% summarise(max(c),b[which.max(c)])

2 个答案:

答案 0 :(得分:2)

以下是使用dplyr获取max值&#39; c&#39;的行的一个选项。找到(按&#39; a&#39;分组)。

 library(dplyr)
 group_by(mydf,a) %>% 
            slice(which.max(c))

或者如果需要返回&#39; NA&#39;因为&#39; b&#39;和&#39; c&#39;按&#39; a&#39;分组的列其中所有元素都在&#39; b&#39;是NA,然后我们可以使用data.tanle。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(mydf)),按&#39; a&#39;,if all分组&#39; c&#39;元素是&#39; NA&#39;,我们通过使用不存在的索引.SD.SD[.N+1]进行子集来返回NA(else)或.SD[which.max(c)]返回Data.table的子集。 &#39;最大&#39;价值&#39; c&#39;找到( library(data.table) setDT(mydf)[,if(all(is.na(c))) .SD[.N+1] else .SD[which.max(c)] , by = a] # a b c #1: 1 car 7 #2: 2 phone 3 #3: 3 computer 4 #4: 4 NA NA )。

os.listdir

答案 1 :(得分:2)

我使用data.table作为:

require(data.table)
setDT(mydf)[order(-c), .SD[1L], keyby=a]

dplyr中,这会转化为:

require(dplyr)
mydf %>% arrange(-c) %>% group_by(a) %>% slice(1L)
# slice seems to auto sort by 'a'