2016-06-10 110 views
1

我有一個非數值的矩陣(缺失值是空白,而不是南)。R:基於行值的排序矩陣

mat = read.table(textConnection(
" s1 s2 s3 
g1 a;b a b 
g2  b 
g3 a  a;b"), row.names = 1, header = TRUE, sep = "\t", stringsAsFactors = FALSE) 
mat = as.matrix(mat) 

我想要做的是將矩陣子集來選擇行中具有兩個最高值的行。

所以結果應該是

g1 a;b a b # with three values 
g3 a  a;b # with two values 
# g2 should be excluded because it only has one value 

我的做法是通過價值觀的量

  • 排序矩陣
  • 子集來分類的矩陣

但我不知道如何按照條目數量對矩陣進行排序。

任何想法?

+0

所以,你想計算矩陣中有值的單元格,按此計數排序,並將行降到某個閾值以下? – lmo

回答

3

您可以在該行嘗試使用apply,並檢查行中有多少個元素是空字符串,然後按計數排序。因此,分類矩陣會是這樣:

mat[order(apply(mat, 1, function(row) sum(row != "")), decreasing = T), ] 
    s1 s2 s3 
g1 "a;b" "a" "b" 
g3 "a" "" "a;b" 
g2 "" "" "b" 

說,如果閾值是2,你也可以在功能指定它的情況下直接排序:

mat[apply(mat, 1, function(row) sum(row != "") >= 2), ] 
    s1 s2 s3 
g1 "a;b" "a" "b" 
g3 "a" "" "a;b" 

另一種方式@alexis_laz的建議是使用

mat[rowSums(mat != "") >= 2, ] 
    s1 s2 s3 
g1 "a;b" "a" "b" 
g3 "a" "" "a;b" 
+1

'apply'調用可以避免,因爲'!='以「矢量化」的方式工作; 'rowSums(mat!=「」)'。另外,'nchar'和'nzchar'也可以很方便,與''「'比較。 –

+0

@alexis_laz總是忘記這一點。我一直在這樣做。感謝您指出了這一點。 – Psidom