我有一个大的制表符分隔文件,其中包含数千列和数千行。看起来像:
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命令中执行此操作?
答案 0 :(得分:3)
我们可以在split.default
到R
到list
的列名的子串上使用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))