我在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的新人..
答案 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