将第一行指定为数据框的列名

时间:2014-10-20 16:00:02

标签: r

我正在尝试将数据帧的第一行指定为组合名称,我的数据框是动态命名的,例如“frame_1”“frame_2”e.t.c

我是这样做的:

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))) )

为frame_i生成colnames向量

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”作为列名。

1 个答案:

答案 0 :(得分:2)

尝试

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将其保存在文件中。