2016-06-10 116 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