2016-06-10 4 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) 

내가 원하는 것은 행의 하위 2 개 값이 가장 큰 행을 선택하는 것입니다.

그래서 결과는
  • 하위 분류 매트릭스
  • 하지만 이해가 안 돼요

    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을 사용하여 무언가를 시도하고 행의 몇 요소가 빈 문자열인지 확인한 다음 개수로 정렬 할 수 있습니다. 직접 정렬하지 않고 임계 값이 2

    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" 
    

    말한다면, 당신은 또한 함수를 지정할 수 있습니다 : 그래서 분류 행렬은 같은 것

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

    또 다른 방법을 사용 @alexis_laz에 의해 제안 rowSums :

    +1

    '! ='가 "vectorised"방식으로 작동하기 때문에'apply' 호출을 피할 수 있습니다; 'rowSums (mat! = "")'. 또한''nchar''와''nzchar''도 편리 할 수 ​​있습니다. –

    +0

    @alexis_laz 항상 잊어 버려. 나는 항상이 일을 지키고있다. 그 점을 지적 해 주셔서 감사합니다. – Psidom

    관련 문제