【问题标题】:Merge dataframes of list and obtain names of dataframes as column合并列表的数据框并获取数据框的名称作为列
【发布时间】:2019-08-11 07:29:19
【问题描述】:

我将列表中的所有数据框合并到一个数据框中。

列表中的数据框被调用

TAI
NAM
HEE 

每个数据框都是这样的

Yr-M   Compound1 Compound 2
2015-01   0.002    0.15
2015-02   0.004    0.02
2015-03   0.01     0.09

当我将所有数据框与meanall<-do.call(rbind, meaneach) 合并时,我得到了

         Yr-M  Compound1  Compound2
TAI.1   2015-01   0.002    0.15
TAI.2   2015-02   0.004    0.02
TAI.3   2015-03   0.01     0.09
  .
  .
  .
NAM.1   2015-01   0.03     0.4
NAM.2   2015-02   0.001    0.005

我想得到一个包含列表名称而不是行名的列(如上),并且没有数字(TAI.1,TAI.2...),我只想要名称 TAI

这样我就明白了:

 List    Yr-M  Compound1  Compound2
  TAI   2015-01   0.002    0.15
  TAI   2015-02   0.004    0.02
  TAI   2015-03   0.01     0.09
  .
  .
  .
  NAM   2015-01   0.03     0.4
  NAM   2015-02   0.001    0.005

我该怎么做?

【问题讨论】:

  • 有那么一会儿,我试图了解meando.call 中的作用,但我猜您将您的列表命名为mean...?您可以看到为什么这是不好的做法。至于行名,您不能有重复项。所以最好的办法是将行名转换为列,然后使用gsub 删除.[0-9]
  • 我用了一个不同的名字,这里只是为了避免误解而改了

标签: r list rbind


【解决方案1】:

行名不能重复。所以最好的办法是将行名转换为列,然后使用 gsub 删除 .[0-9],即

df <- do.call(rbind, your_list)
df$list_id <- gsub('\\..*', '', rownames(df))

请注意,您可以使用 dplyrdata.table 版本的 rbinding 列表,其中可以选择将列表名称包含为列,即

dplyr::bind_rows(your_list, .id = 'list_id')
data.table::rbindlist(your_list, idcol = 'list_id')

【讨论】:

    【解决方案2】:

    您可以在通过do.call 合并三个列表后添加带有列表名称的附加列:

    nameColumn <- data.frame(listName = c(rep(c('TAI','NAM','HEE'),
                                              c(length(TAI),length(NAM),length(HEE) ))
    meanall <- cbind(meanall, nameColumn)
    

    如果您希望nameColumn 成为第一列,只需将cbind 中的参数切换为

    meanall <- cbind(nameColumn, meanall)
    

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2013-02-16
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多