2016-06-10 6 views
1

У меня есть матрица с не числовыми значениями (отсутствующие значения пусты, а не Nan).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 использует rowSums:

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

'apply' call можно избежать, так как'! = 'Работает с« векторизованным »способом; 'rowSums (mat! =" ")'. Кроме того, «nchar» и «nzchar» также могут быть полезны, если сравнивать с «» «». –

+0

@alexis_laz Всегда забывайте об этом. Я все время занимаюсь этим. Спасибо что подметил это. – Psidom

Смежные вопросы