2015-01-28 3 views
0

어떻게 3 개 미만의 변수로 데이터 프레임을 삭제할 수 있습니까?환경에서 데이터 프레임을 조건부로 제거하십시오.

`1001.AFG.1.A`<-data.frame(x = 1, y = 1:10) 
apply(ls(), function(x) {if (dim(x)[2]<3) rm(x)}) 

오류 메시지는 다음과 같습니다 :

Error in match.fun(FUN) : argument "FUN" is missing, with no default 
+2

'sapply' 또는'lapply'로 시도하십시오. 'apply'는'matrix'와 마진을 기다리는 것입니다 (행 방향으로 1, 열 방향으로 2). 또한, 실제 객체의'dim '을 테스트하기 위해'get'을 추가해야합니다. 이름뿐 아니라 환경을 지정할 필요가 있습니다. – Cath

+0

'mget (ls())을 사용해야 할 수도 있습니다. '그런 다음 조건을 사용하여 그것이 data.frame인지 확인하고 'lapply'를 사용하여 목록에 3 개 이상의 변수가 있는지 확인하십시오. 이름을 알아 내고'rm (list = .., envir = .GlobalEnv)'을 사용하십시오. – akrun

+1

@GPierre 비슷한 질문이 RichardScriven에 의해 최근에 응답되었습니다. 차이점 만 치수 검사를 포함합니다. 이 링크를 확인하십시오 http://stackoverflow.com/questions/28142088/how-to-exclude-only-the-data-frames-from-the-global-environment-in-r/28142128#28142128 – akrun

답변

3

1) 첫 번째 줄은 각 객체에 대한 구성 요소가있는 to.rm이라는 이름의 논리 벡터를 생성합니다.이 객체는 해당 객체를 제거해야하는 경우 TRUE이고 그렇지 않으면 FALSE입니다. 따라서 names(to.rm)[to.rm]은 제거 할 객체이므로 rm에 입력하십시오. 이를 두 단계로 나누어 실제로 rm을 수행하기 전에 to.rm을 검토 할 수 있습니다.

to.rm <- unlist(eapply(.GlobalEnv, function(x) is.data.frame(x) && ncol(x) < 3)) 
rm(list = names(to.rm)[to.rm], envir = .GlobalEnv) 

이 지구 환경에 직접 입력하면 (즉 fucntion에 배치하지 않음)의 마지막 줄에서 다음 envir = .GlobalEnv이 기본이며 생략 될 수있다.

2) 또 다른 방법은 표시된대로 env의 개체 이름을 반복하는 것입니다. verbose 인수를 사용하여 수행중인 작업을 표시하고 dryrun 인수를 사용하여 실제로 제거하지 않고 제거 할 내용을 표시합니다.

rm2 <- function(env = .GlobalEnv, verbose = FALSE, dryrun = FALSE, all.names = FALSE) { 
    for(nm in ls(env, all.names = all.names)) { 
    obj <- get(nm, env) 
    if (is.data.frame(obj) && ncol(obj) < 3) { 
     if (verbose || dryrun) cat("removing", nm, "\n") 
     if (!dryrun) rm(list = nm, envir = env) 
    } 
    } 
} 

rm2(dryrun = TRUE) 
rm2(verbose = TRUE) 

업데이트에 rm 추가 envir 인수 (1). 그것은 이미 (2)에있었습니다.

업데이트 2 (2)에 대한 부수적 인 내용.

+0

두 솔루션 작업 에드. 감사. – GPierre

3

당신은 시도 할 수 있습니다 :

sapply(ls(), function(x) { 
       if (is.data.frame(get(x)) && dim(get(x))[2]<3) rm(list=x,envir=.GlobalEnv) 
      }) 

나는 당신이 장 복사를 억제하려면, 당신이 할 수 있습니다

을 나는이 시도
invisible(sapply(ls(), function(x) { 
       if (is.data.frame(get(x)) && dim(get(x))[2]<3) rm(list=x,envir=.GlobalEnv) 
      })) 
+0

감사합니다 당신의 제안. 이 코드 조각으로, 나는 인수가 길이가 0 인 오류가 발생합니다. 나의 데이터 프레임 이름은 점들 : ex :'1001.AFG.1.A'을 포함합니다. 나는 그것이 최고가 아님을 안다. 이것이 솔루션에 영향을 미칠 수 있습니까? – GPierre

+0

@GPierre : 문제는 'if'조건의 두 번째 부분이'data.frame' 객체가없는 경우에도 평가 되었기 때문에 ('dim' ...가 없을 수도 있습니다), '&' '&&'에서 첫 번째 부분이'true' 인 경우에만 조건의 두 번째 부분을 평가할 수 있습니다. – Cath

+0

@CathG이 솔루션은 올바른 결과를 제공하지 못하는 반면 링크의 데이터 프레임은 올바르게 데이터 프레임을 제거합니다. – akrun

관련 문제