【问题标题】:how to assign colnames for multiple dataframes from their first row in R environment如何从 R 环境中的第一行为多个数据框分配列名
【发布时间】:2017-05-17 01:47:40
【问题描述】:

我列出了向量中的所有数据帧,并通过从向量 (list_all) 中调用它们来对数据帧执行不同的操作。我正在尝试使用第一行为每个数据框分配 colnames。

#table_1
           V1                V2              V3                V4              V5
1:      caffeine              ACHE            Adora1            ADORA1           Adora2a
2:                   7.25-    7.25    15.00-   44.00    44.00-   49.00     9.40-   48.10

#table_2
             V1     V2
1: paraxanthine daf-12
2:                  NA

#table_3

             V1              V2              V3              V4              
1: theophylline          Adora1          ADORA1         Adora2a         
2:                 0.70-  26.00    0.00-  20.00    1.31-  25.30   

list_all <- c("table_1","table_2","table_3") # this list was derived from previous code of 60 lines
n_drugs <- 3
drug_names <- c("caffeine","paraxanthine","theophylline")
output_final <- matrix(ncol=n_drugs , nrow=1)

for (t in 1:length(list_all)){
    output_final[t] <- paste(drug_names[t],"output_final", sep = "_")
    names_all <- c()
    names_all[t,] <- unlist(c(as.character(get(noquote(list_all[t]))[1,])))    #saving colnames in 'names_all'
    names_all[t,1] <- c("drug_name")      # change first column name
    assign(output_final[t],setnames(get(noquote(list_all[t])),colnames(get(noquote(list_all[t]))),names_all[t,]))
  }

当我逐行运行此代码时,它可以工作,但是当我创建函数并运行该函数时,我得到了错误

“get(noquote(list_all[t])) 出错:找不到对象‘NA’”。帮帮我

【问题讨论】:

  • colnames 出现在数据框的第一行通常表明您应该在第一次读取数据时执行read.csv(..., header=TRUE) 之类的操作,并且在那个阶段修复比尝试更容易做任何你在这里尝试的事情。
  • 请提供无效的代码
  • 看起来你正在尝试在另一种编程语言中有意义的东西,但不一定是 R......关于你正在尝试做的事情的更多细节会有所帮助
  • @HubertL 这是在给定表上不起作用的代码
  • @mr_swap:从您的示例数据看来,问题在于您如何读取数据。你有没有探索过任何read.&lt;filetype&gt;() 函数的选项来检查它是否可以更明智地处理标题?

标签: r get names


【解决方案1】:

就像上面的 cmets 建议的那样,在导入数据时应该更容易处理这个问题,例如read.table(..., header = TRUE).

然而,如果你无法做到这一点,这个解决方案可能对你有用:

set_first_row_name <- function(X) {
  X <- as.data.frame(X)
  # X should be a data frame
  names(X) <- X[1,]
  X[-1,]
}
for (the_one_table in list_all) {
  # list_all is your created name list of tables
  # Do set_first_row_name to each table and assign them back respectively
  assign(the_one_table, set_first_row_name(get(the_one_table)))
}

【讨论】:

  • 谢谢,正如我所说,对原始表执行了很多操作,并且由于各种原因删除了许多列。因此,尽管 header = True,但它并不重要。我不想在列表中列出所有表。我想把它们分开。
  • 然后在 for 循环中使用 assign 而不是 lapply 以满足您分离它们的需要。
  • @mr_swap 我刚刚重温了我之前的答案。为您做了一些修改。我知道这已经很长时间了,但你仍然可以看看这是否有帮助。
【解决方案2】:
# put into a list and convert first row to header
list_all <- list(df1, df2, df3)

#convert first row to header
list_all <- lapply(
  list_all,
  function(df) {
    names(df) <- lapply(df[1, ], as.character)
    df <- df[-1,] 
    return(df)
  }
)

【讨论】:

  • 请记住,Stack Overflow 不仅仅是为了解决眼前的问题,而是为了帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于此,您能否edit 您的答案包括对您正在做什么的解释以及为什么您认为这是最好的方法?
猜你喜欢
  • 2014-12-15
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2011-11-22
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多