2012-03-01 6 views
2

진단 코드 집합에 대해 2 개월 동안 응급실 방문의 큰 행렬 "dt"가 있습니다. 열은 "연령", "성별", "날짜", "군", "우편 번호", "제목", "위치", "진단"및 "dt"입니다. 크기는 872344 x 9입니다.R : 특정 열에 특정 값이있는 행만 행렬의 하위 집합

이 행렬에서 서브 세트를 만들고 "diag"열의 숫자가 800과 849 (모든 열) 인 행만 포함하는 새로운 행렬을 만들고 싶습니다.

나는 루프를 만들고 "which"또는 "if.else"를 사용하고 있지만 정신 블록을 실행 중입니다. 나가 당기고 싶었던 diag 코드가 하나뿐이라면 더 쉬울 것 같지만, 50 개의 코드는 일련의 작업을 복잡하게합니다 ... 루프를 가리키고 있습니까? 누구든지 특정 값을 찾는데 기초하여 부분 집합하는 방법에 대한 아이디어가 있습니까?

여기 (작동하지 않았다) 내 시작의 :

dta = dt 
b = 800:849 
for (i in 1:length(b)) { 

} 

답변

5

을 감안하여 열 이름을, 당신의 dt이 data.frame 아닌 매트릭스 의심; is.data.frame(dt)을 실행하면 확인할 수 있습니다.

이 데이터를 필터링 할 수있는 쉬운 방법이 경우 인 경우는 다음과 같이 subset 기능을 사용하는 것입니다

dta <- subset(dt, diag >= 800 & diag <= 849) 
+0

맞습니다. 데이터 프레임입니다. 나는 R의 언어의 차이를 이해하지 못했을 것 같다. 고맙습니다! – mEvans

6
dta = dt[dt[, 8] >= 800 & dt[, 8] <= 849, ] 

ETA :이 매트릭스가 아닌 data.frame입니다 확실 해요? 그것은 data.frame 인 경우, 당신은 할 수 있습니다 :

dta = dt[dt$diag >= 800 & dt$diag <= 849, ] 
0

위의 우수한 답변뿐만 아니라, 내가 추가 할 수 있습니다 filter 기능

패키지 dpylr에서
filter(dt,diag>=800 & diag <= 849) 

filter() 당신이 그것을 &와 함께 결합 필터링 조건, 임의의 수를 줄 수 있다는 점을 제외하고 subset() (안유사하다 실수로하기 쉬운!). dpylr 패키지에는 멋진 데이터 조작 기능이있어 모양을 볼 수 있습니다.

0

matrix()은 일반적으로 어쨌든 더 빠른 속도로 동작하므로 느린 속도로 메모리를 사용하므로 matrix()data.frame()으로 변환하지 않습니다. 데이비드의 답변에 더하여

열 번호 인덱스를 이용 등을위한 microbenchmark 패키지 명령에 의해 도시 된 바와 같이

dta = dt[dt[,'metric'] >= 800 & dt[,'metric'] <= 849,] 

:

dta = dt[dt[,8] >= 800 & dt[,8] <= 849,] 

또한 매트릭스와 열 이름 인덱싱을 이용한 형태가 Intel MKL 최적화로 컴파일 된 R로 실행되는 12 열 및 13,241 행의 동일한 행렬 :

microbenchmark::microbenchmark(
    test.matrix  = mt[mt[,3] %in% 5:10 & mt[,5] == 1,], 
    test.data.frame = df[df[,3] %in% 5:10 & df[,5] == 1,], 
    times = 1000 
    ) 

Unit: microseconds 
      expr  min  lq  mean median  uq  max neval 
test.matrix  885.732 938.386 1154.898 943.74 952.4415 138215.318 1000 
test.data.frame 1176.218 1245.826 1363.379 1258.32 1286.4320 3392.556 1000 

행렬이 매우 커지면이 차이가 눈에 띄게됩니다. 내 컴퓨터에서 행렬 인덱스 속도는 data.table보다 우수합니다.

관련 문제