2012-06-14 4 views
23

나는 R에 data.frame의 1,900 만 행과 90 개의 열을 가지고 있습니다. 여분의 RAM 및 CPU주기가 충분합니다. 이 데이터 프레임에서 단일 열 이름을 변경하는 것이 R에 대한 매우 강력한 작업입니다.대용량 data.frame을 사용하면 열 이름을 변경하는 데 시간이 오래 걸리는 이유는 무엇입니까?

system.time(colnames(my.df)[1] <- "foo") 
    user system elapsed 
356.88 16.54 373.39 

왜 이렇게 되나요? 모든 행에 열 이름이 어떻게 든 저장됩니까? 완전히 새로운 데이터 프레임을 만드는 것입니까? 이 작업은 무시할 수있는 시간 내에 완료되어야합니다. R manual entry에는 아무 것도 보이지 않습니다.

Windows 7에서 R (64 비트) 빌드 7600을 실행 중이며 현재 작업 공간에서 작은 data.frame의 colnames를 설정하면 system.time()에 따라 '0'시간이 걸립니다.

편집 : 나는 data.table을 사용할 가능성을 알고 있으며 솔직히 말해서 나는 차를 마시 러 가서 이름을 바꾸기 위해 5 분을 기다릴 수있다. 내가 관심이있는 것은 무엇이 일어나고 있으며 왜 그럴까요? 여러 개의 덧글이 언급 한

+0

이상하게도, 나는 이것에 대해 방금 읽었습니다. 나는 실제로 그것이 df를 복사하고 있을지도 모른다고 믿는다. 2.15.0을 사용하는 경우 패키지 ** 데이터 프레임 **을 설치 및로드하고 해당 정보가 도움이되는지 확인하십시오. – joran

+5

매튜 도울 (Matthew Dowle)이 이것을 매우 잘 설명하고 있으며 ('http://tackoverflow.com/questions/10655438/rename-one-named-column-in-r/10655997#10655997)'data.table 패키지 . – Chase

+0

덕분에, 나는 이미'data.table'을 꽤 많이 사용합니다. (끈적 거리는 상황에서 나를 빠져 나간 Matthew Dowle에게 빚이 있습니다!) - 여기서 나는 무슨 일이 일어나고 있는지, 왜 이상적인지에 대해 설명했습니다. 대답은 실제로 "data.frame은 잘못 코딩 된 것입니까?" – Ina

답변

21

으로는 전체 data.frame의 1 ~ 4 복사본을 만드는 (당신이 그것을 할 방법에 따라) 때문에, 데이터 프레임 열 이름을 변경하는 것은 느립니다.

DF = data.frame(a=1:2,b=3:4)  # base data.frame to demo copies 
try(tracemem(DF))     # try() for non-Windows where R is 
            # faster without memory profiling 
colnames(DF)[1] <- "A"    # 4 copies of entire object 
names(DF)[1] <- "A"    # 3 copies of entire object 
names(DF) <- c("A", "b")   # 1 copy of entire object 
`names<-`(DF,c("A","b"))   # 1 copy of entire object 
x=`names<-`(DF,c("A","b"))   # still 1 copy (so not print method) 
# What if DF is large, say 10GB in RAM. Copy 10GB just to change a column name? 

일이 이런 식으로 일을하는 이유 (시작) 을 이해하는 당신은 아마해야합니다 : 여기, data.table?setkey 도움말 페이지에서 내가 본이 동작을 시연의 가장 좋은 방법은 R-devel에 관한 몇 가지 관련 토론을 탐구 해보십시오. R-devel: speeding up perceptionR-devel: Confused about NAMES

그 스레드 내 인상주의 독서가이다 : 그것은 수정은 원본을 덮어 쓰기 전에 '밖으로 시도'할 수 있도록

  1. 적어도 하나의 복사본을 만들어 여기에 몇 가지 있습니다. 따라서 다시 할당 할 값에 문제가있는 경우 [<-.data.frame 또는 names<-은 원래 개체에 손상을주지 않고 오류 메시지를 전달하고 전달할 수 있습니다.

  2. R 코어의 여러 구성원이 현재 작업 방식에 완전히 만족하지 않습니다. 몇몇 사람들은 어떤 경우에는 "R이 궤도를 잃는다"고 설명한다. Luke Tierney는 과거에이 복사와 관련된 몇 가지 수정을 시도했음을 나타냅니다. "몇 가지 경우에있어서 항상 배제해야했습니다." 시몬 Urbánek의는 "몇 가지도 올라오고있을 수있다"고 힌트

(내가 말했듯이,하지만, 그건 그냥 인상주의이다 : 나는 단순히 R의의 세부 사항에 대한 전체 대화를 따를 수 아니에요 내부)


는 또한, 당신이 그것을 보지 못한 경우, 여기 names(z)[3] <- "c2" 같은 것이 "정말"어떻게 작동하는지와 관련이 :!

# From ?names<- 
z <- "names<-"(z, "[<-"(names(z), 3, "c2")) 

참고 :이 답변의 대부분은 Matthew Dowle의 답변 this other question에 대한 것입니다. (필자는 자신의 질문과 관련이 있기 때문에 여기에 배치하고 노출을 더 할 가치가 있다고 생각했습니다.)

+1

++ R-devel 스레드를 구문 분석하기 위해, 나는 그 대화 주위에 머리를 감싸는 데 어려움을 겪고있었습니다. – Ina

관련 문제