我有一个数据框:
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
例如,我想将我的数据框缩减为:
sample event length
1 A1 DEL 30
5 A2 INV 20
6 A3 DEL 40
有人可以建议我怎么做吗?
答案 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')
答案 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
。