2012-06-26 2 views
0

R에서 함수의 출력에 대해 "즉각적인"논리적 인덱싱을 수행 할 수 있습니까?함수 출력에서 ​​R 즉치 (파이프?) 논리적 색인 생성?

다소 모호한 질문을 명확히하기 위해, 많은 사람들이 전에 만났던 것 같은 약간의 예가 있습니다. 그것은 종종 그러나

tabulate(data) 
[1] 2 0 1 0 1 2 0 1 0 1 0 0 0 1 2 0 0 0 0 1 

: 우리가 지금이 벡터의 기능 "도표로"를 적용하면

data <- c(1,1,3,5,6,6,8,10,14,15,15,20) 

는 결과가 될 것입니다 : 우리는 다음과 같은 벡터 "데이터"가 있다고 가정 전통적과 같이 할 것이다 (이 경우)있는 벡터의 액세스하는 것이 바람직 항목 만 비 제로는, (나는 ... 추측) :

tabulate(data)[tabulate(data) != 0] 
[1] 2 1 1 2 1 1 1 2 1 

그러나이 경우은 "표로에 (데이터) 계산이 필요합니다. 두 번 ated, 이는 비효율적이거나 낭비로 보입니다. 적어도 그것은 분명히 우아하지 않습니다. 마찬가지로, 하나의 큰 데이터 세트로 작업하는 경우 "임시 테이블 (데이터)"결과를 저장하는 것은 번거로울 수 있습니다. 작업을 수행하는 "마법"direct.index 기능처럼? 뭔가 존재 하는가? 같은,

direct.index(tabulate.data, condition='!= 0') 

... 기본적으로 이미 계산시 인덱싱 조건을 충족하지 않는 모든 값을 폐기 것이다, 전체 프로세스를 더 빠르고 효율적으로 수행합니다.

"tabulate"res에서 제로 제거의 구체적인 문제 ults는 단순함을 위해 여기에 주어진다; 사실, 나는 많은 다른 상황에서 이것에 대해 내 머리를 긁었다. 어쩌면 나는 또한 R에 대한 몇 가지 기본적인 오해가있을 것이다 ...

그런데, 나는 "subset"을 들여다 보았다. 그러나 그것은 내가 찾고있는 것 같지 않다.

답변

2

그러나 손

direct.index <- function(x, condition, value){ 
    index <- eval(call(condition, x, value)) 
    x[which(index)] 
} 

direct.index(tabulate(data), '!=', 0) 
## [1] 2 1 1 2 1 1 1 2 1 

에 의해 작성된 함수의 버전은, 난 당신이 기능 table

table(data) 
## data 
## 1 3 5 6 8 10 14 15 20 
## 2 1 1 2 1 1 1 2 1 
+1

나는 그것이 더 분명 작동하는지 확인하기 위해 함수를 편집 일을 찾고 생각 일반적으로 테이블을위한 것이 아니라 (즉, 이름이 바뀐 개체). – Andrie

+0

답변 해 주셔서 감사합니다! 나는 위의 예제에서 사용하는 "올바른"것 인 테이블을 조사했습니다. 그러나 또한 더 빠릅니까? 나는 또한 내부적으로 "tabulate"를 사용하고 "unique"호출과 0이 아닌 인덱싱을 자동으로 수행한다고 생각했습니다. 또한 제공 한 수동 기능은 내가 설명한 문제에 대한 래퍼입니다. 원하지 않는 값을 직접 삭제할 수있는 방법이 없다고 가정합니다. 예를 들어, 넓은 범위 ([1, 10^9]의 vaules 등)가있는 큰 벡터 (10^6 요소 이상)에서 "표"를 작성합니다. – Lymond