根据R中的列名称将一个数据帧拆分为多个数据帧

时间:2020-06-03 16:52:47

标签: r

我有一个带有557列的大型数据框,我想将其拆分为多个不同列长的数据框。我尝试在下面解释我希望使用较小的数据框实现的目标。

我的数据框:

> df <- data.frame(row.names = c("x","y","z"),
                 "a" = c(2844.8,10232.5,20150.6),
                 "b" = c(1430.9,29263.6,26334.5),
                 "c" = c(906.2,6019.1,6848.6),
                 "REG01" = c(1871.0,69618.7,45032.2),
                 "d" = c(2106.0,29929.6,58626.1),
                 "e" = c(1818.8,232371.1,42713.6),
                 "REG02" = c(1364.5,57561.7,20656.4),
                 "f" = c(520.4,46754.9,9036.9),
                 "REG03" = c(1821.4,43862.3,51876.1))

> df

        a       b       c   REG01       d        e    REG02        f   REG03
x  2844.8  1430.9   906.2  1871.0  2106.0   1818.8   1364.5    520.4  1821.4
y 10232.5 29263.6  6019.1 69618.7 29929.6 232371.1  57561.7  46754.9 43862.3
z 20150.6 26334.5  6848.6 45032.2 58626.1  42713.6  20656.4   9036.9 51876.1

所需的输出-3个数据帧的列表,如下所示:

> df.list[[1]]

        a       b       c   REG01       
x  2844.8  1430.9   906.2  1871.0  
y 10232.5 29263.6  6019.1 69618.7 
z 20150.6 26334.5  6848.6 45032.2 

> df.list[[2]]

         d        e    REG02
x   2106.0   1818.8   1364.5
y  29929.6 232371.1  57561.7
z  58626.1  42713.6  20656.4

> df.list[[3]]

      f     REG03
x 520.4    1821.4
y 46754.9 43862.3
z 9036.9  51876.1

我真的很难知道从哪里开始,因为结果数据帧将具有不同的大小,要拆分的列是不同的名称,并且鉴于我的实际数据要大得多(我的结果将是44个数据帧),我可以t显式引用col名称(尽管它们都以REG开头,并且后跟2位数字)。

感谢您的任何建议

2 个答案:

答案 0 :(得分:3)

您可以使用split.default

split.default(df, c(0, cumsum(grepl("^REG", names(df)[-ncol(df)]))))

$`0`
        a       b      c   REG01
x  2844.8  1430.9  906.2  1871.0
y 10232.5 29263.6 6019.1 69618.7
z 20150.6 26334.5 6848.6 45032.2

$`1`
        d        e   REG02
x  2106.0   1818.8  1364.5
y 29929.6 232371.1 57561.7
z 58626.1  42713.6 20656.4

$`2`
        f   REG03
x   520.4  1821.4
y 46754.9 43862.3
z  9036.9 51876.1

答案 1 :(得分:1)

以base-R

lapply(split( as.data.frame(t(df)), cumsum(c(1,grepl("REG",colnames(df))))[1:ncol(df)]),t)

给予

$`1`
        a       b      c   REG01
x  2844.8  1430.9  906.2  1871.0
y 10232.5 29263.6 6019.1 69618.7
z 20150.6 26334.5 6848.6 45032.2

$`2`
        d        e   REG02
x  2106.0   1818.8  1364.5
y 29929.6 232371.1 57561.7
z 58626.1  42713.6 20656.4

$`3`
        f   REG03
x   520.4  1821.4
y 46754.9 43862.3
z  9036.9 51876.1