有条件地从数据框中删除重复行

Conditionally removing duplicate rows from a data frame

我在 R 中有一个数据框,由两列组成:'Genes' 和 'Expression'。对于某些基因,它有重复的行,但是这些重复的条目具有不同的表达式值。我想压缩重复的行,因此每个基因只有一行,并且这一行具有最大的 'absolute' 表达式值。见下面的例子:

对于这个数据框...

df <- data.frame(Gene=c("AKT","MYC","MYC","RAS","RAS","RAS","TP53"),
                 Expression=c(3,2,6,1,-4,-1,-3))

  Gene Expression
1  AKT          3
2  MYC          2
3  MYC          6
4  RAS          1
5  RAS         -4
6  RAS         -1
7 TP53         -3

我想要这个输出..

  Gene Expression
1  AKT          3
2  MYC          6
3  RAS         -4
4 TP53         -3

我可以使用

识别重复的基因
duplicated(df$Gene)

但我不确定如何排除那些较小绝对值的重复项。

Ps - 我是这个 R malarkey 的新手..

看起来像是 aggregate() 的工作。

# Input data frame
df <- data.frame(Gene=c("AKT", "MYC", "MYC", "RAS", "RAS", "RAS", "TP53"),
                 Expression=c(3, 2, 6, 1, -4, -1, -3))

# Maximum absolute value of Expression by Gene
maxabs <- with(df, aggregate(Expression, list(Gene=Gene), FUN=function(x) max(abs(x))))

# Combine with original data frame
df <- merge(df, maxabs, by="Gene")

# Get desired rows
subset(df, abs(Expression) == x)

# Output:
  Gene Expression
1  AKT          3
3  MYC          6
5  RAS         -4
7 TP53         -3

但是,如果同一基因的多个表达测量值相同且恰好满足过滤条件,会发生什么情况?你仍然会有重复的行,但现在我们为每个基因选择哪一行都无关紧要了。我们所要做的就是再添加一个步骤。

举例来说,假设 MYC 的表达式值为 6 的额外一行。然后按照相同的步骤进行操作会得到以下结果:

# Example of multiple rows after filtering:
  Gene Expression
1  AKT          3
2  MYC          6
3  MYC          6
4  RAS         -4
5 TP53         -3

# Assign the subset to something
df.maxexpr <- subset(df, abs(Expression) == x)

# Remove duplicate genes (all gene rows should be identical)
df.maxexpr[!duplicated(df.maxexpr$Gene), ]

然后这种情况下的输出与之前的预期输出相匹配。

这里是 dplyr 的解决方案:

df <- data.frame(Gene=c("AKT","MYC","MYC","RAS","RAS","RAS","TP53"),
                 Expression=c(3,2,6,1,-4,-1,-3))

library(dplyr)
df %>% 
  group_by(Gene) %>%
  filter(row_number(desc(abs(Expression))) == 1)

给出:

#Source: local data frame [4 x 2]
#Groups: Gene
#
#  Gene Expression
#1  AKT          3
#2  MYC          6
#3  RAS         -4
#4 TP53         -3