2014-02-13 2 views
2

내가 가지고 data.frame처럼 보이는 dt 전화 :R - 적용 및 제거 열은

row.names  A  B  C  D 
     1 0.1 0.2 0.5 0.3 
     2 0.2 0.3 0.4  0 
     3 10 -0.1 -0.3 0.3 # remove A cause 10/0.2 > 2 

을 내가 열을 제거 할 같은 그 열 X, X[i]/X[i-1]>2,i>=2 경우에. 즉, 이전 행으로 나눈 현재 행이 2보다 큰 경우 (2 배 증가), 열을 제거하십시오.

temp<-dt 
val<-apply(temp,2,function(y) { 
    y<-na.omit(y) # omit na 
    ans1 <- y[-1,]/y[-nrow(y),] - 1 # divide previous row 
    if (max(ans1,na.rm=TRUE)>2) { 
    y<-NULL # remove from temp 
    } 
}) 

을하지만 temp에서 행을 제거하지 않는 것 :

그래서 같은 apply을 시도했습니다. 나는 어쩌면 colnames의 목록을 반환하는 것에 대해 생각했지만 내가 그것을 한 방식으로 apply 내부에서 그들을 얻을 수 없습니다.

아이디어가 있으십니까?

감사합니다.

val<-sapply(dt,function(y) { 
    y2<-na.omit(y) # omit NA 
    ans1 <- y2[-1]/y2[-length(y2)] - 1 # divide previous row 
    if (max(ans1,na.rm=TRUE)>1.5|min(ans1,na.rm=TRUE)< -0.5) { 
    return(NULL) # return all NULL 
    } else { 
    return(y) # return original 
    } 
}) 

답변

1

이것은 (사용할 수 없음) NA에를 A 값을 변환합니다 :

dt$A[-1] <- ifelse(dt$A[-1]/head(dt$A[-1], -1) > 2, NA, dt$A[-1]) 

는 === 편집 ===
는 lukeA의 대답의 수정 된 버전으로 파악

이제 A 열에 NA 초를 어떻게 처리할지 결정할 수 있습니다. 행을 삭제합니다

dt <- dt[!is.na(dt$A), ] 

이것은 모든 열을 이 같은 작동합니다

dt[, -1] <- sapply(dt[, -1], function(x) { 
    x[-1] <- ifelse(x[-1]/head(x[-1], -1) > 2, NA, x[-1]) 
    x 
}) 
dt <- na.omit(dt) # remove NA rows 

을 그리고 당신은 원한다면 NA, 당신은 이런 식으로 작업을 수행 할 수 있습니다 열을 삭제합니다 :

dt[, c(1, which(!is.na(colSums(dt[, -1]))))] 
+0

답장을 보내 주셔서 감사합니다. '적용'과 같은 모든 열에 대해이 작업을 수행 할 수있는 방법이 있습니까? 행렬'dt'는 단지 작은 예제 일 뿐이므로 매우 큰 행렬 (300x300 이상을 생각하십시오)에서 행할 것입니다. –

+0

@ Ubobo'dt [, -1]'은 * 모든 열을 제외하고 첫 번째 열 *을 말합니다 : 그렇습니다 : 예. 그러나'ifelse'는 가장 빠르지 않다. 반면에'colSums'는 초고속입니다. 그것을 밖으로 시도하십시오. – lukeA

+0

감사합니다. 내 의견을 편집하고 있었지만 시간 초과되었습니다. O! 나는'dt [, - 1]'로 시도했지만,'x : -1]/head (x [-1], -1)의 에러를 얻는다 : 길이가 더 긴 객체의 길이가 더 짧다. 개체 길이'. 결과'dt '는 비어 있습니다. –