我有一个数据框,我想通过变量(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)])
答案 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'