我正在分析 R 中数千个基因的表格。每个基因都是一行并具有相应的mRNA表达值。在这些值中,我被要求从所有条目中找到最大表达式值,这是我使用max()
函数完成的。它返回了最大表达式值,但没有返回相应的行(基因名称)。 是否有人知道如何在表格中找到已知值的未知行?
答案 0 :(得分:2)
要查找最大值的位置,您可以使用which.max()
功能。
更一般地说,如果要获取符合某些条件的元素的位置,可以使用extract
运算符[
并执行相等性测试。例如对于data.frame dat
:
which(dat == max(dat), arr.ind = TRUE)
这将返回最大值所在的数组索引。您可以将条件更改为任何内容,效果相同。
有关使用extract
对数据进行子集化的详细信息,请参阅帮助文件?'['
。
答案 1 :(得分:0)
这个怎么样?这可能是一种更优雅的方式。
df <- data.frame(x=c(1,2,3,4,5), y=c(1,1,1,6,2))
which.max(apply(df, 1, max))
它按行计算最大值,然后找到具有总体最大值的行。根据您拥有的列数与行数的比较,可能更快找到包含最大值的列,然后找到相应的行:
match(max(df), df[, which.max(apply(df, 2, max))])
答案 2 :(得分:0)
尝试使用示例:
> ddf = structure(list(ex1 = c(10L, 35L, 18L), ex2 = c(20L, 20L, 42L),
ex3 = c(30L, 15L, 25L)), .Names = c("ex1", "ex2", "ex3"), class = "data.frame", row.names = c("abcd",
"defg", "ijkl"))
> ddf
ex1 ex2 ex3
abcd 10 20 30
defg 35 20 15
ijkl 18 42 25
如果要找到最大列数:
> data.frame(maxrow=rownames(ddf)[apply(ddf, 2, which.max)], maxval=apply(ddf, 2, max))
maxrow maxval
ex1 defg 35
ex2 ijkl 42
ex3 abcd 30
或:
> t(data.frame(maxrow=rownames(ddf)[apply(ddf, 2, which.max)], maxval=apply(ddf, 2, max)))
ex1 ex2 ex3
maxrow "defg" "ijkl" "abcd"
maxval "35" "42" "30"
如果要找到最多行:
> idx = apply(ddf, 1, which.max)
> outdf = data.frame(gene=rownames(ddf), maxcol=colnames(ddf)[idx], maxval=apply(ddf, 1, max))
> rownames(outdf) = 1:nrow(ddf)
> outdf
gene maxcol maxval
1 abcd ex3 30
2 defg ex1 35
3 ijkl ex2 42
或:
> data.frame(maxcol=colnames(ddf)[apply(ddf, 1, which.max)], maxval=apply(ddf, 1, max))
maxcol maxval
abcd ex3 30
defg ex1 35
ijkl ex2 42