有条件地从数据框中删除重复行
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
我在 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