如何将列表的列名更改为循环中每个数据框的第一行?

时间:2018-05-11 17:16:16

标签: r

我有一个从Excel文件中提取的数据框列表。 Excel文件具有时髦的格式,真正的列名称是数据框的第一行。该列表包含9个数据框,这些数据框未按顺序命名,并且基于Excel文件的选项卡名称。

这是我到目前为止所做的:

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

R给我一个错误:

Error in get(i) : invalid first argument

以下是我的数据框列表结构示例:

str(all_list)
List of 9
$ Retail        :'data.frame':  306 obs. of  25 variables:
$ X__1        : chr [1:306] NA NA "VARIABLE" "VARIABLE" ...
$ X__2     : chr [1:306] "TIME PERIOD" NA "41640" "41671" ...

正如您所看到的,列表中第一个元素(Retail)中的列名称包含&#34; X __#&#34;格式。有没有一种明确的方法可以在这个列表的一个循环中重新格式化?谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用lapply遍历列表中的每个data.frame来设置第一行的列名。在返回data.frame之前删除第一行。例如:

ll <- list(df1,df2,df3,df4)

lapply(ll, function(x){
  names(x) <- x[1,]
  x[-1,]})

#[[1]]  df1
#  g x    <-- 1st row has been set as column name.
#2 j z
#3 n p
#4 u o
#5 e b

示例数据:

set.seed(1)

df1 <- data.frame(First = sample(letters, 5), Second = sample(letters, 5),
                       stringsAsFactors = FALSE)
df2 <- data.frame(First = sample(letters, 5), Second = sample(letters, 5),
                       stringsAsFactors = FALSE)
df3 <- data.frame(First = sample(letters, 5), Second = sample(letters, 5), 
                       stringsAsFactors = FALSE)
df4 <- data.frame(First = sample(letters, 5), Second = sample(letters, 5),
                       stringsAsFactors = FALSE)

df1
#   First Second
# 1     g      x
# 2     j      z
# 3     n      p
# 4     u      o
# 5     e      b