我有一个60 * 60矩阵,有点难以导航,我想只关注矩阵中的某些值。所以我的想法是,如果它们的值低于/高于某个阈值,则删除所有单元格,如果某个行/列中的所有值都低于阈值,它们也将被删除。
假设我想删除值低于0.5的所有内容
示例输入:
<input id="id1" type="number" max="100" min="40">
<button onclick="count()">OK</button>
<p id="test"></p>
<script>
var inpObj = document.getElementById('id1');
function count() {
if(inpObj.checkValidity() == false || inpObj.length === 0) {
document.getElementById('test').innerHTML = inpObj.validationMessage;
} else {
document.getElementById('test').innerHTML = "Input OK";
}
}
</script>
示例输出:
abcd abcde ab
abcd 0.000000000 0.44757748 0.61945319
abcde 0.447577477 0.00000000 0.33773497
ab 0.619453192 0.33773497 0.00000000
因此在这种情况下,abcde列没有大于0.5的值并且完全丢弃(因为它是对称的,所以行也被删除)。此外,曾经持有数字的所有其他值现在都是空的。我简化了矩阵,可以很容易地看到我想要的细胞。现在,这是一个3 * 3矩阵,所以它不是那么有用,但它可能对有很多值的矩阵很有用。
有没有办法实现这个目标?
答案 0 :(得分:2)
要删除没有0.5
以上值的行和列,您可以使用:
mat[rowSums(mat > 0.5) >= 1, colSums(mat > 0.5) >= 1]
给出:
abcd ab
abcd 0.0000000 0.6194532
ab 0.6194532 0.0000000
要更换个别值,请参阅@ Oliver的回答。替换为NA
比使用空字符值替换更好,因为后者将更改整个矩阵的值类。
使用过的数据:
mat <- structure(c(0, 0.447577477, 0.619453192, 0.44757748, 0, 0.33773497, 0.61945319, 0.33773497, 0),
.Dim = c(3L, 3L),
.Dimnames = list(c("abcd", "abcde", "ab"), c("abcd", "abcde", "ab")))
答案 1 :(得分:1)
你可以尝试:
library(dplyr)
library(tidyr)
df %>%
add_rownames() %>%
gather(key, value, -rowname) %>%
filter(value > 0.5) %>%
spread(key, value, fill = "")
给出了:
#Source: local data frame [2 x 3]
#
# rowname ab abcd
# (chr) (chr) (chr)
#1 ab 0.619453192
#2 abcd 0.61945319
数据强>
df <- structure(list(abcd = c(0, 0.447577477, 0.619453192), abcde = c(0.44757748,
0, 0.33773497), ab = c(0.61945319, 0.33773497, 0)), .Names = c("abcd",
"abcde", "ab"), class = "data.frame", row.names = c("abcd", "abcde", "ab"))
答案 2 :(得分:0)
怎么样?
myMatrix[myMatrix < 0.5] <- NA