2016-05-23 40 views
1

我有一個60 * 60的矩陣,有點難以導航,我只想專注於矩陣中的某些值。因此,我的想法是,如果所有單元格的值低於/高於某個閾值,則放棄所有單元格,並且如果某個行/列中的所有值都低於閾值,則它們也將被丟棄。基於單元格值的子集矩陣和不滿足標準的拖放行/列

比方說,我想放下一切,這裏的值低於0.5

例輸入:

   abcd  abcde   ab 
abcd 0.000000000 0.44757748 0.61945319 
abcde 0.447577477 0.00000000 0.33773497 
ab  0.619453192 0.33773497 0.00000000 

輸出示例:

  abcd   ab  
abcd    0.61945319 
ab  0.619453192 
在這種情況下

因此,ABCDE列有沒有0.5以上的值並完全丟棄(因爲它是對稱的,同時該行被丟棄)。此外,曾經擁有數字的所有其他值現在都是空的。我簡化了矩陣並可以輕鬆查看我想要的單元格。現在,這是一個3 * 3的矩陣,所以它不是很有用,但它對於有很多值的矩陣可能是有用的。

有沒有辦法實現這一目標?

+0

可以使用'rowSums'或'colSums'上(http://stackoverflow.com/a/372​​81038/2204410)爲[這裏所示]的條件做到這一點。例如:mat [rowSums(mat> 0.5)> = 1]' – Jaap

回答

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")) 
+1

最好使用'fill = NA' imo,因爲它不會改變值的類。 – Jaap

+1

@ProcrastinatusMaximus我同意。這實際上效率很低,導致數據結構不佳,無法進一步分析。我只是模仿OP所需的輸出。 –

0

什麼

myMatrix[myMatrix < 0.5] <- NA 
+0

謝謝,這也適用。只需簡單的跟進:我將如何定義一個新的具有這些新NA值的矩陣,所以我不會失去原來的那個? (因爲它已經通過< - ) – praznin

+0

@praznin分配,只需先用'mymat2 < - mymat'複製一個拷貝,然後用'NA'替換。 – Jaap

+0

有道理!謝謝 :) – praznin

1

爲了丟棄具有上述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 

對於更換單個值,見@奧利弗的回答。替換爲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")))