如果我有一个表,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
答案 0 :(得分:5)
您可以将which
与arr.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