2014-10-20 26 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在文件中。

相关问题