2014-10-20 48 views
0

我想一個數據幀的第一行分配是colnames的列名,我的數據幀動態命名,即像「FRAME_1」「frame_2」等分配第一行是一個數據幀

感到這樣做:

for(i in 1:length(holder)){ 
    colnames(eval(parse(text=paste0("frame_",i))))<- eval(parse(text=paste0("frame_",i,"[1,]"))) 
} 

然而,這是生產的神祕的錯誤:

target of assignment expands to non-language object 

我覺得迷惑因爲:

colnames(eval(parse(text=paste0("frame_",i)))) 

可生產colnames的矢量爲frame_i

eval(parse(text=paste0("frame_",i,"[1,]"))) 

可生產frame_i的第一行。

這兩者都是相同的長度,如果有人能解釋這個錯誤給我,我會很感激

一些代碼,以產生類似的數據集礦:

for(i in 1:1000){ 
assign(paste("frame",i,sep="_"), data.frame( c("desired_colname", 4, 3, 5, 7) , c("desired_colname2", 3, 1, 2, 3))) } 

所以我想把「desired_colname」作爲列名。

+0

請問我們可以有一個可重複的例子。 – 2014-10-20 16:02:08

+0

@RichardScriven不,情況並非如此。 我會寫一些代碼來爲你生成可重複的數據。 – user124123 2014-10-20 16:05:22

+0

@ user1987097您是否嘗試過下面的代碼? – akrun 2014-10-20 16:18:41

回答

1

嘗試

frame_1 <- data.frame(c("desired_colname", 4, 3, 5, 7) , 
           c("desired_colname2", 3, 1, 2, 3)) 
frame_2 <- data.frame(c("desired_colname", 4, 2, 6, 7) , 
          c("desired_colname2", 3, 5, 3, 3)) 
frame_3 <- data.frame(c("desired_colname", 5, 6, 9, 5) , 
          c("desired_colname2", 5, 9, 14, 3)) 


holder <- ls(pattern="^frame_") 

for(i in holder){ 
tmp <- get(i) 
colnames(tmp) <- unlist(get(i)[1,]) 
assign(i, tmp) 
} 

上面的代碼可以也可以寫成:

for(i in holder){ 
    assign(i, `names<-`(get(i), unlist(get(i)[1,]))) 
    } 


frame_1 
# desired_colname desired_colname2 
#1 desired_colname desired_colname2 
#2    4    3 
#3    3    1 
#4    5    2 
#5    7    3 


frame_2 
# desired_colname desired_colname2 
#1 desired_colname desired_colname2 
#2    4    3 
#3    2    5 
#4    6    3 
#5    7    3 

另一種選擇是使用list2env

list2env(lapply(mget(holder), function(x) 
      {colnames(x) <- unlist(x[1,]);x}), envir=.GlobalEnv) 
    #<environment: R_GlobalEnv> 

雖然,所有這些操作可以做在list之內,然後使用write.table保存我t在文件中。