2012-10-23 2 views
1

2D data.frame 또는 matrix을 1D 벡터로 자동 변환하면 일반 함수를 작성하는 데 약간의 문제가 발생합니다. foo[,1:3] 같은 명령을 입력 foo의 일부 열을 필터링하려고 예를 들어, data.frame 또는 matrix을 위해 잘 작동 :입력이 벡터 일 때 작동하는 테이블에 대한 일반 함수 작성

foo=matrix(1:9,nrow=3) 
bar = function(x) print(x[,1]) 
bar(foo) # [1] 1 2 3 

그러나 우리가 처음 foo의 일부 행을 필터링 할 생각, 그것은 단지 하나의 것을 발생 행은 남아있다 : ​​

이 문제는 간단한 트릭에 의해 해결 될 수

bar(foo[1,]) # Error in x[, 1] : incorrect number of dimensions 
:

bar = function(x) { 
    if (is.null(dim(x))) x = t(data.frame(x)) 
    print(x[,1]) 
} 

bar()의 본문에있는 x에 다른 필터가 있으면이 필터를 다시 벡터로 변환하면 문제가 훨씬 더 복잡해집니다. 그런 다음 모든 필터링에 대해 우리가 가지고있는 것을 여전히 확인하기 위해 점검하고 수행해야합니다.

다른 문제는 행렬의 필터링 된 부분이 단일 행/열인 경우 행 이름 및/또는 열 이름 누락입니다. 필터링 된 부분을 행렬로 재구성하고 원래 행/열 이름을 검색하여 결과 행렬에 할당하려면 추가 조작이 필요합니다.

질문은 : 간단하게 테이블에 대해 작동하는 함수를 변환합니다. 입력이 벡터 인 경우에도 여전히 작동합니까?

+2

이것이'drop' 인수가있는 것이라고 생각합니다. – joran

+0

대신에'stopifnot (is.data.frame (x) || is.matrix (x))'를 추가하여 행렬 및/또는 data.frames에서만 작동하는 함수를 작성하는 것을 고려하십시오. 'bar (foo [1,])'을 실행했다면 의미있는 메시지로 에러가 나올 것이고, @joran처럼 bar ​​(foo [1,, drop = FALSE])를 사용해야한다는 것을 알 것입니다. 제안했다. – flodel

답변

1

벡터 또는 data.frame 일 수있는 데이터로 작업 할 때 비슷한 문제가 있습니다.

일반적으로 함수 내에서 서브 세트 함수를 만듭니다.

foo <- function(dat,rows) { 

if(is.data.frame(dat) || is.matrix(dat)) { 
dat <- dat[rows,] 
} else { 
dat <- dat[rows] 

... # continue with function 
} 

이 방법은 원본 개체의 클래스도 유지 관리합니다.

+0

위의 조란 주석을 추가하여 답변을 완성 할 수 있습니다! – Ali

관련 문제