2011-03-28 2 views
2

R의 작업 공간에 여러 개의 데이터 프레임이 있고 모든 데이터 프레임의 열 이름 목록이 필요하다고 가정합니다.작업 영역의 모든 데이터 프레임에있는 모든 열의 이름 찾기

다음과 같이 작동 할 것이라고 생각했습니다. 그러나 그렇지 않습니다. 자신의 작업 공간에서 사용해보십시오.

sapply(ls(),names) 

왜 작동하지 않습니까? ls()는 모든 데이터 프레임의 목록을 만든 다음 이름 함수를 각 데이터 프레임에 적용해야합니다. 지금은 내 간단한 질문입니다.

다음에는 "날짜"문자가있는 이름이있는 모든 열을 결정하여 해당 데이터 프레임에 관계없이 각 열에 다음 함수를 적용 할 수 있습니다.

as.Date(dataframe$dateofenrollment,origin="1899-12-30") 

답변

5

ls()은 개체 자체가 아닌 작업 영역에있는 개체의 이름을 반환하기 때문에 작동하지 않습니다.

당신은 아마 다음과 같이합니다 : 이것은 데이터 프레임되지 않은 개체에 대한 NULL 요소가됩니다

lapply(ls(), function(x) if(is.data.frame(o <- get(x))) names(o)) 

을하지만, 아마도 당신은 해결할 수 있습니다.

+0

감사합니다. 당신의 한 줄이 내가 원하는 것을 나에게주었습니다. 나는 Chase의 제안을 사용하여 그것을 적용했다. 나는 전체 라인을 만들었다. ignore.case = TRUE, value = TRUE) lapply (ls(), function (x) grep ("date | started", if.data.frame (o <- get (x)). 이렇게하면 "날짜"또는 "시작된"변수 이름이 표시됩니다. – Farrel

+0

if 문 내에 할당. ** shudder ** – hadley

2

질문의 첫 번째 부분은 allNames <- lapply(ls(), function(x) names(get(x)))으로 대답 할 수 있습니다. 관심있는 컬럼을 결정하기 위해 정규 표현식 함수 중 하나를 사용하는 것은 lapply(allNames, function(x) grepl("date", x))과 같은 것으로도 꽤 솔직해야합니다. 처음 두 비트를 가져 와서 열을 업데이트하는 방법에 관해서는 기진 맥진하지만, 아마도 이것은 여러분과 다른 사람들을 올바른 길로 인도 할 것입니다.

1

두 가지 목표를 모두 달성 할 수있는 간단한 예제가있는 또 다른 솔루션입니다. 귀하의 상황에 맞게 쉽게 수정할 수 있습니다. 질문이 있으면 알려주세요.

# create a set of dummy data frames 
df1 = data.frame(x = rnorm(100), y = rnorm(100)) 
df2 = data.frame(x = rnorm(100), z = rnorm(100)) 
ch1 = c('a', 'b', 'c') 


# get all objects 
all.obj = sapply(ls(), get) 

# get data frames 
dfrs = all.obj[sapply(all.obj, is.data.frame)] 

# get data frames containing 'x' as column name 
dfrs2 = dfrs[lapply(dfrs, function(df) {'x' %in% names(df)}) == 'TRUE'] 

# replace x with square of x in all these data frames 
dfrs3 = lapply(dfrs2, function(df) {df$x = df$x^2; df}) 
+0

R 코드 줄 끝에'; '을 모두 쓸 필요가 없습니다. –

+0

멋진 작품 (+!)! 이 방법의 한 단점은 원본 객체의 사본을 생성하고 원래의'df1' 및'df2'가 아닌 객체를 수정한다는 것입니다. 실제 응용 프로그램에서 주변에 떠 다니는 객체의 여분의 복사본을 사용하면 메모리 문제가 발생할 수 있습니다. – Chase

+0

참. lapply를 사용하여 함수 범위 내에서 원래 객체를 수정하는 방법을 제안 하시겠습니까? 당신은 생각합니다 - >>가는 길은 무엇입니까? – Ramnath

0
f <- function(){ 
lo <- ls(envir=.GlobalEnv) 
lo <- lo[sapply(lo,function(x) eval(substitute(class(X)=="data.frame", 
                list(X=as.name(x)))) 
        )] 
if(length(lo)>0){ 
    res <- lapply(lo,function(x) eval(substitute(names(X),list(X=as.name(x))))) 
    names(res) <- lo 
} else res <- NULL 
return(res) 
} 

편집은 "수"기능에 대한 필요성을 설명하기위한

ls.names <- function(){ 
    res <- lapply(mapply(as.name,ls(pos=1)), 
       function(x) if(class(xe<-eval(x))=="data.frame") names(xe)) 
    res <- res[!unlist(lapply(res,is.null))] 
    return(res) 
} 

EDIT2

eapply(env=.GlobalEnv,function(x) if(is.data.frame(x)) names(x))