【问题标题】:Conditionally removing duplicate rows from a data frame有条件地从数据框中删除重复行
【发布时间】:2015-05-16 04:14:51
【问题描述】:

我在 R 中有一个数据框,由两列组成:“基因”和“表达”。它有一些基因的重复行,但是这些重复的条目具有不同的表达式值。我想压缩重复的行,所以每个基因只有一行,并且这一行具有最大的“绝对”表达式值。示例如下:

对于这个数据框...

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

【问题讨论】:

标签: r dataframe duplicates conditional


【解决方案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), ]

那么这种情况下的输出和之前一样匹配预期的输出。

【讨论】:

  • 太好了,谢谢!!非常感谢演练。 (顺便说一句 - 在重复的参数中缺少“,”)
  • @AlasdairR:很高兴它对你有用。感谢您指出缺少的逗号,已修复。
【解决方案2】:

这是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2018-02-05
    • 2015-03-13
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多