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

时间:2015-03-13 15:36:39

标签: r dataframe duplicates conditional

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

对于此数据框...

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的新人..

2 个答案:

答案 0 :(得分:1)

看起来像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), ]

然后,此情况下的输出与之前的预期输出匹配。

答案 1 :(得分:1)

以下是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