【问题标题】:Split Data Frame Into N Data Frames Based On Column Names根据列名将数据框拆分为 N 个数据框
【发布时间】:2019-02-07 00:01:11
【问题描述】:

我有一个大型数据(数千列)框架,其中几列具有重复的列名。然后,有一组列名,其中一部分列名是重复的,而同一列名的另一部分不是。

使用R 及以上两个属性,我想将所有此类列拆分为不同的数据框以进行进一步分析。为此,我想在数据框上运行以下动态逻辑:

  1. 首先:查找和cbind() 将列名列复制到不同的数据框中。如果 10 列具有相同的列名,则它们形成一个数据框,另外 5 个具有相同列名的列形成另一个数据框。
  2. 第二种:查找和cbind()重复的列名列到不同的数据框中如果-之前的列名字符串与-之前的列名字符串匹配另一列并且 - 之后的列名字符串 与另一列的- 之后的部分列名匹配。

下面是示例输入数据(大数据太大,但遵循完全相同的属性),前两列将根据上述示例形成一个数据框。将有另一个数据框包含从三到最后一列的列。

我试过split(),但到目前为止还没有成功。关于如何做到这一点的任何建议?

输入数据示例

structure(list(`A-DIODE` = c(1.2, 0.4), `A-DIODE` = c(1.3, 0.6
), `B-DIODE` = c(1.4, 0.8), `B-ACC1` = c(1.5, 1), `B-ACC2` = c(1.6, 
1.2), `B-ANA0` = c(1.7, 1.4), `B-ANA1` = c(1.8, 1.6), `B-BRICKID` = c(1.9, 
1.8), `B-CC0` = c(2L, 2L), `B-CC1` = c(2.1, 2.2), `B-DIGDN` = c(2.2, 
2.4), `B-DIGDP` = c(2.3, 2.6), `B-DN1` = c(2.4, 2.8), `B-DN2` = c(2.5, 
3), `B-DP1` = c(2.6, 3.2), `B-DP2` = c(2.7, 3.4), `B-SCL` = c(2.8, 
3.6), `B-SDA` = c(2.9, 3.8), `B-USB0DN` = 3:4, `B-USB0DP` = c(3.1, 
4.2), `B-USB1DN` = c(3.2, 4.4), `B-USB1DP` = c(3.3, 4.6), `B-ACC1` = c(3.4, 
4.8), `B-ACC2` = c(3.5, 5), `B-ANA0` = c(3.6, 5.2), `B-ANA1` = c(3.7, 
5.4), `B-BRICKID` = c(3.8, 5.6), `B-CC0` = c(3.9, 5.8), `B-CC1` = c(4L, 
6L), `B-DIGDN` = c(4.1, 6.2), `B-DIGDP` = c(4.2, 6.4), `B-DN1` = c(4.3, 
6.6), `B-DN2` = c(4.4, 6.8), `B-DP1` = c(4.5, 7), `B-DP2` = c(4.6, 
7.2), `B-SCL` = c(4.7, 7.4), `B-SDA` = c(4.8, 7.6), `B-USB0DN` = c(4.9, 
7.8), `B-USB0DP` = c(5L, 8L), `B-USB1DN` = c(5.1, 8.2), `B-USB1DP` = c(5.2, 
8.4), `B-NA` = c(5.3, 8.6), `B-ACC2PWRLKG_0v4` = c(5.4, 8.8), 
`B-ACC2PWRLKG_0v4` = c(5.5, 9), `B-P_IN_Leak` = c(5.6, 9.2
)), class = "data.frame", row.names = c(NA, -2L))

基于上述逻辑的输出

数据框 1

A-DIODE A-DIODE
1.2     1.3
0.4     0.6

数据框 2

B-DIODE B-ACC1 B-ACC2 B-ANA0 B-ANA1 B-BRICKID B-CC0 B-CC1 B-DIGDN B-DIGDP B-DN1 B-DN2 B-DP1 B-DP2 B-SCL B-SDA B-USB0DN B-USB0DP
1.4    1.5    1.6    1.7    1.8       1.9     2   2.1     2.2     2.3   2.4   2.5   2.6   2.7   2.8   2.9        3      3.1
0.8    1.0    1.2    1.4    1.6       1.8     2   2.2     2.4     2.6   2.8   3.0   3.2   3.4   3.6   3.8        4      4.2
B-USB1DN B-USB1DP B-ACC1.1 B-ACC2.1 B-ANA0.1 B-ANA1.1 B-BRICKID.1 B-CC0.1 B-CC1.1 B-DIGDN.1 B-DIGDP.1 B-DN1.1 B-DN2.1 B-DP1.1
3.2      3.3      3.4      3.5      3.6      3.7         3.8     3.9       4       4.1       4.2     4.3     4.4     4.5
4.4      4.6      4.8      5.0      5.2      5.4         5.6     5.8       6       6.2       6.4     6.6     6.8     7.0
B-DP2.1 B-SCL.1 B-SDA.1 B-USB0DN.1 B-USB0DP.1 B-USB1DN.1 B-USB1DP.1 B-NA B-ACC2PWRLKG_0v4 B-ACC2PWRLKG_0v4.1 B-P_IN_Leak
4.6     4.7     4.8        4.9          5        5.1        5.2  5.3              5.4                5.5         5.6
7.2     7.4     7.6        7.8          8        8.2        8.4  8.6              8.8                9.0         9.2

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以在数据集names的子字符串上使用split.default

    split.default(df1, sub("-.*", "", names(df1)))
    

    或者如果我们知道-之前只有一个字符

    split.default(df1, substr(names(df1), 1, 1))
    #$A
    #  A-DIODE A-DIODE.1
    #1     1.2       1.3
    #2     0.4       0.6
    
    #$B
    #  B-DIODE B-ACC1 B-ACC2 B-ANA0 B-ANA1 B-BRICKID B-CC0 B-CC1 B-DIGDN B-DIGDP B-DN1 B-DN2 B-DP1 B-DP2 B-SCL B-SDA B-USB0DN B-USB0DP
    #1     1.4    1.5    1.6    1.7    1.8       1.9     2   2.1     2.2     2.3   2.4   2.5   2.6   2.7   2.8   2.9        3      3.1
    #2     0.8    1.0    1.2    1.4    1.6       1.8     2   2.2     2.4     2.6   2.8   3.0   3.2   3.4   3.6   3.8        4      4.2
    #  B-USB1DN B-USB1DP B-ACC1.1 B-ACC2.1 B-ANA0.1 B-ANA1.1 B-BRICKID.1 B-CC0.1 B-CC1.1 B-DIGDN.1 B-DIGDP.1 B-DN1.1 B-DN2.1 B-DP1.1 B-DP2.1
    #1      3.2      3.3      3.4      3.5      3.6      3.7         3.8     3.9       4       4.1       4.2     4.3     4.4     4.5     4.6
    #2      4.4      4.6      4.8      5.0      5.2      5.4         5.6     5.8       6       6.2       6.4     6.6     6.8     7.0     7.2
    #  B-SCL.1 B-SDA.1 B-USB0DN.1 B-USB0DP.1 B-USB1DN.1 B-USB1DP.1 B-NA B-ACC2PWRLKG_0v4 B-ACC2PWRLKG_0v4.1 B-P_IN_Leak
    #1     4.7     4.8        4.9          5        5.1        5.2  5.3              5.4                5.5         5.6
    #2     7.4     7.6        7.8          8        8.2        8.4  8.6              8.8                9.0         9.2
    

    【讨论】:

    • .@akrun - 谢谢。在子数据框中,是否可以删除最后添加的.1?如果是,那么我想从子数据框中删除列名与其所属的子数据框的第一列不匹配的所有列。
    • @ChetanArvindPatil 这是可能的,但我建议保持这种方式,因为如果名称相同会​​混淆选择哪些列
    • @ChetanArvindPatil 默认情况下,data.frame 调用make.names,后者调用make.unique(如果check.namesTRUE)以使列名具有唯一性。如果你想保留重复的列名,那么lapply(split.default(df1, substr(names(df1), 1, 1)), function(x) setNames(x, sub("\\.\\d+$", "", names(x))))
    • .@akrun - 谢谢。我想在子数据框中保留重复的列,但如果子数据框列名在子数据框中是唯一的,则只保留第一列。基本上,我不在乎(这就是为什么我想在split.default 之后保持列名相同,即使它们相同)上面$B 中的第三列名称是什么,因为第二列名称与第一列不匹配列名和这么多模式对我的数据处理来说已经足够了。
    • @ChetanArvindPatil 假设您将其分配给标识符 lst1 <- split.default(df1, sub("-.*", "", names(df1))) 现在循环使用 lst1lapplylst2 <- lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x)))) 现在,您可以检查“lst2”(基于示例)
    猜你喜欢
    • 2020-01-08
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2015-11-14
    相关资源
    最近更新 更多