在数据框中为每个组取最大值

时间:2017-10-27 15:18:55

标签: r dataframe

我有一个数据框:

  sample event length
1     A1   DEL     30
2     A1   INV     10
3     A1   DEL     30
4     A2   DEL     10
5     A2   INV     20
6     A3   DEL     40

myData <- structure(list(sample = structure(c(1L, 1L, 1L, 2L, 2L, 3L), .Label = c("A1", 
"A2", "A3"), class = "factor"), event = structure(c(1L, 2L, 1L, 
1L, 2L, 1L), .Label = c("DEL", "INV"), class = "factor"), length = c(30, 
10, 30, 10, 20, 40)), .Names = c("sample", "event", "length"), row.names = c(NA, 
-6L), class = "data.frame")

我正在尝试为每个样本绘制每个事件的长度。一些样本有多个事件 - 其中一些是相同的 - 在这种情况下我想只绘制每个样本的最长事件,而不是像ggplot当前那样对每个样本的值进行求和:

p<-ggplot(myData)
p<-p + geom_bar(aes(sample,length),stat="identity")
p

enter image description here

例如,我想将我的数据框缩减为:

  sample event length
1     A1   DEL     30
5     A2   INV     20
6     A3   DEL     40

有人可以建议我怎么做吗?

2 个答案:

答案 0 :(得分:2)

我们可以在'sample'分组后使用which.max

library(dplyr)
library(ggplot2)
myData %>%
    group_by(sample) %>%
    slice(which.max(length)) %>%
    ggplot(.) + 
    geom_bar(aes(sample, length), stat = 'identity')

enter image description here

答案 1 :(得分:2)

您可以通过以下方式进行预数据操作:

ggplot(myData) + stat_summary(aes(x=sample, y=length), geom = "bar", fun.y = max)

或者,使用数据操作的data.table方式是:

library(data.table)                                                                                                                                                                                                                                                                                   -6L), class = "data.frame")
setDT(myData)[, .SD[which.max(length)], by = sample][,ggplot(.SD) + geom_bar(aes(x = sample, y = length), stat = "identity")]

有趣的是,您可以在ggplot语法中调用data.table

enter image description here