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
}
})
답장을 보내 주셔서 감사합니다. '적용'과 같은 모든 열에 대해이 작업을 수행 할 수있는 방법이 있습니까? 행렬'dt'는 단지 작은 예제 일 뿐이므로 매우 큰 행렬 (300x300 이상을 생각하십시오)에서 행할 것입니다. –
@ Ubobo'dt [, -1]'은 * 모든 열을 제외하고 첫 번째 열 *을 말합니다 : 그렇습니다 : 예. 그러나'ifelse'는 가장 빠르지 않다. 반면에'colSums'는 초고속입니다. 그것을 밖으로 시도하십시오. – lukeA
감사합니다. 내 의견을 편집하고 있었지만 시간 초과되었습니다. O! 나는'dt [, - 1]'로 시도했지만,'x : -1]/head (x [-1], -1)의 에러를 얻는다 : 길이가 더 긴 객체의 길이가 더 짧다. 개체 길이'. 결과'dt '는 비어 있습니다. –