我有一个带有分组变量(“基因”)和值变量(“值”)的数据框:

Gene   Value
A      12
A      10
B      3
B      5
B      6
C      1
D      3
D      4


对于我的每个级别分组变量,我希望提取最大值。因此,结果应该是每个级别的分组变量只有一行的数据帧:

Gene   Value
A      12
B      6
C      1
D      4
可以解决问题吗?

评论

是。聚合可以解决问题。只需将max用作相关功能即可。

#1 楼

在R中可以执行此操作的可能性很多。以下是其中一些:

df <- read.table(header = TRUE, text = 'Gene   Value
A      12
A      10
B      3
B      5
B      6
C      1
D      3
D      4')

# aggregate
aggregate(df$Value, by = list(df$Gene), max)
aggregate(Value ~ Gene, data = df, max)

# tapply
tapply(df$Value, df$Gene, max)

# split + lapply
lapply(split(df, df$Gene), function(y) max(y$Value))

# plyr
require(plyr)
ddply(df, .(Gene), summarise, Value = max(Value))

# dplyr
require(dplyr)
df %>% group_by(Gene) %>% summarise(Value = max(Value))

# data.table
require(data.table)
dt <- data.table(df)
dt[ , max(Value), by = Gene]

# doBy
require(doBy)
summaryBy(Value~Gene, data = df, FUN = max)

# sqldf
require(sqldf)
sqldf("select Gene, max(Value) as Value from df group by Gene", drv = 'SQLite')

# ave
df[as.logical(ave(df$Value, df$Gene, FUN = function(x) x == max(x))),]


评论


您可以将dplyr添加到集合中(+1)

–talat
14年8月14日在18:00

而且,聚合的公式方法可以提供更好的输出...

– A5C1D2H2I1M1N2O1R2T1
14年8月14日在18:04

这应该是SO R Wiki的问答

–hrbrmstr
14年8月14日在18:08

@beginneR:我还没有使用过dplyr(我更是一个data.table-guy),但是很容易发现。

–EDi
14年8月14日在18:19

@AnandaMahto:还添加了aggregate.formula ...

–EDi
14年8月14日在18:19

#2 楼

df$Gene <- as.factor(df$Gene)
do.call(rbind, lapply(split(df,df$Gene), function(x) {return(x[which.max(x$Value),])}))


只需使用基数R

评论


可爱。谢谢。

– stephanmg
10月23日11:17

#3 楼

使用sqldf和标准sql获取按另一个变量分组的最大值

https://cran.r-project.org/web/packages/sqldf/sqldf.pdf

library(sqldf)
sqldf("select max(Value),Gene from df1 group by Gene")




将出色的Hmisc软件包用于按功能分组应用(max)
https://www.rdocumentation.org/packages/Hmisc /versions/4.0-3/topics/summaryize

library(Hmisc)
summarize(df1$Value,df1$Gene,max)


评论


仅通过一个命令行就能获得最大值和最小值(或它们之间的差)吗?

–上帝
18年6月28日在12:44

嗯看起来像我可以使用:聚合(na.omit(值)〜基因,df,函数(x)c(max(x)-min(x)))

–上帝
18年6月28日在12:52