拆分默认值而不按列名称排序

时间:2019-03-28 04:27:50

标签: r dataframe

对于以下数据,我正在split.default()中运行R。问题在于,列表中分隔的子data.frames()正在根据列名进行排序。

我不希望这种情况发生,并且想要保留列名序列,因为那是原始数据。有没有可以遵循的方法?请提出建议。

输入数据

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

代码

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

输出

$`A`
  A-DIODE A-ACC1 A-ACC2 A-ANA0 A-ANA1 A-BRICKID A-CC0 A-CC1 A-DIGDN A-DIGDP A-DN1 A-DN2 A-DP1 A-DP2 A-SCL A-SDA A-USB0DN A-USB0DP A-USB1DN A-USB1DP
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      3.2      3.3
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      4.4      4.6
  A-ACC1.1 A-ACC2.1 A-ANA0.1 A-ANA1.1 A-BRICKID.1 A-CC0.1 A-CC1.1 A-DIGDN.1 A-DIGDP.1 A-DN1.1 A-DN2.1 A-DP1.1 A-DP2.1 A-SCL.1 A-SDA.1 A-USB0DN.1
1      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     4.7     4.8        4.9
2      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     7.4     7.6        7.8
  A-USB0DP.1 A-USB1DN.1 A-USB1DP.1 A-NA A-ACC2PWRLKG_0v4 A-ACC2PWRLKG_0v4.1 A-P_IN_Leak
1          5        5.1        5.2  5.3              5.4                5.5         5.6
2          8        8.2        8.4  8.6              8.8                9.0         9.2

$B
  B-DIODE B-DIODE.1
1     1.2       1.3
2     0.4       0.6

在上面的输出中,我希望首先出现$B,然后出现$A,因为这就是Input Data遵循的顺序。

2 个答案:

答案 0 :(得分:2)

一种选择是将名称转换为factor并根据需要设置级别

new_name <- sub("-.*", "", names(data))
split.default(data, factor(new_name, levels = unique(new_name)))

#$B
#  B-DIODE B-DIODE.1
#1     1.2       1.3
#2     0.4       0.6

#$A
#  A-DIODE A-ACC1 A-ACC2 A-ANA0 ....
#1     1.4    1.5    1.6    1.7 ....   
#2     0.8    1.0    1.2    1.4 ....   

通过将levels指定为unique(new_name),我们可以确保根据列表在数据框中的出现情况(而不是按字母顺序)对列表进行拆分。

正如@thelatemail所建议的那样,我们还可以通过基于factor unique

对列表重新排序来避免将名称转换为new_name变量
split.default(data, new_name)[unique(new_name)]

答案 1 :(得分:0)

另一种选择是使用rle

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