【问题标题】:creating a list of dataframes创建数据框列表
【发布时间】:2016-04-24 23:16:10
【问题描述】:

我有一个如下所示的数据框:

a <- as.data.frame(t(matrix(c('gr1','','','','gr2','','','','','gr3','','',
                        rep(1,12),rep(2,12)),ncol=3)))

a 看起来像:

    V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11 V12
    gr1             gr2                 gr3      
     1  1   1   1   1   1   1   1   1   1   1   1
     2  2   2   2   2   2   2   2   2   2   2   2

V1-V4 列属于 gr1,V5-V9 属于 gr2,V10-V12 属于 gr3。

我想将这些组 (gr1-gr3) 及其对应的列分开,并将它们全部放在一个列表中,以便稍后我可以循环并进行一些分析。所以想要的输出是:

list1 = (gr1,gr2,gr3),其中 gr1、gr2 和 gr3 中的每一个都是具有相应列的数据框。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    我们根据第一行元素是否为空白 ('') 创建分组变量。然后,split 'a' 的列名与 'grp' 为 list,然后 subset 使用lapply 的列和行(删除第一行),更改 ' 的 names lst' 作为我们提取 'a' 的第一行的 'gr' 值。

    grp <- cumsum(as.character(unlist(a[1,]))!='')
    lst <- lapply(split(names(a), grp),  function(nm) a[-1, nm])
    
    nm1 <- as.character(unlist(a[1,]))
    names(lst) <-  nm1[nzchar(nm1)]
    

    注意:'a' 中的列是factor 类,因为第一行存在第二个标题('gr')。如果我们需要将'lst'中每个data.frame中的列转换为数字,

     lapply(lst, function(x) {
          x[] <- lapply(x, function(.x) as.numeric(as.character(.x)))
          x})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-21
      • 2020-09-19
      • 2016-02-29
      • 1970-01-01
      • 2020-11-15
      • 2021-12-22
      相关资源
      最近更新 更多