计算表R中的值

时间:2015-07-24 19:19:11

标签: r

如果我有一个表,out.i我希望R返回超过某个值的单元格的列名(例如.5)。如果没有单元格超过该值,我希望能够返回NA

例如,给定out.i

> dput(out.i)
out.i=structure(c(0, 0, 0, 1, 0, 1, 0, 0.5, 1, 0, 1, 0, 0, 0, 0, 0, 
0, 0.5, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 
0, 0, 0.5, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0.5, 0, 0, 0, 0, 1, 
0), class = "table", .Dim = c(11L, 5L), .Dimnames = structure(list(
    c("0:36", "1:14", "1:32", "10:00", "2:10", "3:23", "4:37", 
    "5:30", "7:03", "7:34", "8:52"), c("4", "6", "7", "8", "10")), .Names = c("", "")))

我想返回所有值超过.5的行名和列名。

这应该产生:

0:36  10
1:14  10
1:32  10
10:00 4
2:10  NA

2 个答案:

答案 0 :(得分:5)

您可以将whicharr.ind=TRUE

一起使用
indices <- which(out.i > 0.5, arr.ind=TRUE)
data.frame(row.name=rownames(out.i)[indices[,1]],
           col.name=colnames(out.i)[indices[,2]])
  row.name col.name
1    10:00        4
2     3:23        4
3     7:03        4
4     8:52        4
5     0:36       10
6     1:14       10
7     1:32       10
8     7:34       10

这将返回矩阵中超过0.5的所有单元格。如果您只想要每行中的第一个元素超过该值,而对于没有这些元素的行使用NA,则可以尝试:

data.frame(row.name=rownames(out.i),
           col.name=colnames(out.i)[apply(out.i, 1, function(x) head(c(which(x > 0.5), NA), 1))])
#    row.name col.name
# 1      0:36       10
# 2      1:14       10
# 3      1:32       10
# 4     10:00        4
# 5      2:10     <NA>
# 6      3:23        4
# 7      4:37     <NA>
# 8      5:30     <NA>
# 9      7:03        4
# 10     7:34       10
# 11     8:52        4

答案 1 :(得分:1)

我的输出并不完全符合您的要求,也许我不明白这一点,无论如何这里是一个dplyr解决方案,它具有非常有用的add_rownames功能。

library(dplyr)
as.data.frame(which(out.i > 0.5, arr.ind = T)) %>% add_rownames()
Source: local data frame [8 x 3]

  rowname row col
1   10:00   4   1
2    3:23   6   1
3    7:03   9   1
4    8:52  11   1
5    0:36   1   5
6    1:14   2   5
7    1:32   3   5
8    7:34  10   5