根据列名称将Matrix文件拆分为多个文件

时间:2018-08-23 13:34:09

标签: python linux bash perl awk

我有一个大的制表符分隔文件,其中包含数千列和数千行。看起来像:

ID  A_1 A_2 A_3 B_1 B_3 B_4 C_2 C_3 C_5
xx  01  02  03  04  05  06  07  08  09
xy  03  05  33  44  15  26  27  08  09

我想将此表分成多个文件:

# A.txt
ID A_1 A_2 A_3
xx 01  02  03
xy 03  05  33  

# B.txt
ID B_1 B_3 B_4
xx 04  05  06
xy 44  15  26  

# C.txt
ID C_2 C_3 C_5
xx 07  08  09
xy 27  08  09

因此,文件名将是列标题前缀。 ID列在每个文件中都是固定的。每个文件中的其余列均基于下划线之前的公共前缀。

如何在Linux / Bash / Perl / python命令中执行此操作?

1 个答案:

答案 0 :(得分:3)

我们可以在split.defaultRlist的列名的子串上使用data.frame

nm1 <- sub("_\\d+", "", names(df1)[-1])
lst <- lapply(split.default(df1[-1], nm1), transform, ID = df1$ID)

或与Map

setNames(Map(cbind, ID = df1['ID'], 
     split.default(df1[-1], nm1)), unique(nm1))
#$A
#  ID A_1 A_2 A_3
#1 xx   1   2   3
#2 xy   3   5  33

#$B
#  ID B_1 B_3 B_4
#1 xx   4   5   6
#2 xy  44  15  26

#$C
#  ID C_2 C_3 C_5
#1 xx   7   8   9
#2 xy  27   8   9

数据

df1 <- structure(list(ID = c("xx", "xy"), A_1 = c(1L, 3L), A_2 = c(2L, 
5L), A_3 = c(3L, 33L), B_1 = c(4L, 44L), B_3 = c(5L, 15L), B_4 = c(6L, 
26L), C_2 = c(7L, 27L), C_3 = c(8L, 8L), C_5 = c(9L, 9L)),
class = data.frame", row.names = c(NA, -2L))