조건을 만족하는 행렬의 행을 선택하십시오.


144

행렬이있는 R에서 :

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

행에 열이 3 = 11 인 하위 행렬을 추출하고 싶습니다.

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

반복하지 않고이 작업을 수행하고 싶습니다. 나는 R을 처음 사용하므로 아마도 매우 분명하지만 문서는 종종 다소 간결합니다.


4
모든 답변의 기본 아이디어는 일부 인덱스와 길이가 같은 논리 형 벡터 / 행렬 (TRUE 및 FALSE)이있는 경우 TRUE 인 경우 만 선택한다는 것입니다. [ ]답변 사이 에 코드를 실행하면 더 명확하게 볼 수 있습니다.
Sacha Epskamp

답변:


160

as.data.frame ()을 사용하여 행렬을 데이터 프레임으로 변환하면 더 쉽습니다. 이 경우 이전 답변 (서브셋 또는 m $ three 사용)이 작동하지만 그렇지 않으면 작동하지 않습니다.

행렬 에서 작업을 수행하기 위해 이름별로 열을 정의 할 수 있습니다.

m[m[, "three"] == 11,]

또는 숫자로 :

m[m[,3] == 11,]

하나의 행만 일치하면 결과는 행렬이 아니라 정수 벡터입니다.


19
매트릭스를 유지해야 할 경우m[m[,3] == 11,,drop=FALSE]
Joris Meys

@neilfws 열 범위에 대한 일부 값을 정의하려는 경우 솔루션은 무엇입니까? 예를 들어 df <- df[!which(df$ARID3A:df$YY1 == "U"),], 여기에서는 열 범위 (ARID3A : YY1)에 U 값이 포함 된 df에서 해당 행을 제거하려고합니다 .
Newbie

열 이름을 지정하지 않고 행렬의 모든 열에 대해 작업하려는 경우 어떻게 작동합니까?
user5359531

@neilfws, 어떻게 && 문을 추가 할 수 있습니까? 두 개의 열 값을 동시에 가져와야합니까?
XD

28
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

다음 명령은 위의 행렬의 첫 번째 행을 선택합니다.

subset(m, m[,4] == 16)

마지막 3 개를 선택합니다.

subset(m, m[,4] > 17)

결과는 두 경우 모두 행렬이됩니다. 열 이름을 사용하여 열을 선택하려면 다음을 사용하여 열을 데이터 프레임으로 변환하는 것이 가장 좋습니다.

mf <- data.frame(m)

그런 다음

mf[ mf$a == 16, ]

또는 subset 명령을 사용할 수 있습니다.


21

dplyr 패키지를 사용하여 간단한 접근 방식을 선택하겠습니다.

데이터 프레임이 데이터 인 경우

library(dplyr)
result <- filter(data, three == 11)

11

하위 집합은 매우 느린 기능이며 개인적으로 쓸모가 없습니다.

난 당신이 data.frame, 배열,라는 행렬이 가정 Mat으로 A, B, C열 이름 등을; 그럼 당신이해야 할 일은 :

  • 한 열에 하나의 조건이있는 경우 A 열이라고하겠습니다.

    Mat[which(Mat[,'A'] == 10), ]

다른 열에 여러 조건이있는 경우 더미 변수를 만들 수 있습니다. 조건이 A = 10, B = 5및 이라고 가정하면 C > 2다음 과 같습니다.

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

와 속도의 장점을 테스트함으로써 system.timewhich방법은 빠른 것보다 10 배입니다 subset방법.


6

행렬이 호출 m되면 다음을 사용하십시오.

R> m[m$three == 11, ]

@juba 열 범위에 대한 일부 값을 정의하려는 경우 솔루션은 무엇입니까? 예를 들어 df <- df[!which(df$ARID3A:df$YY1 == "U"),], 여기에서는 열 범위 (ARID3A : YY1)에 값이 포함 된 df에서 해당 행을 제거하려고합니다.U
Newbie

0

데이터 세트를 data라고하면 모든 행이 'pm2.5'> 300 열 값을 수신 할 수있는 조건을 충족합니다.

데이터 [data [ 'pm2.5']> 300,]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.