如何拆分特定范围内的列?

时间:2016-06-17 08:19:41

标签: python r bash file shell

我正在使用蛋白质轨迹,我有一个很长的数据框架。 (带有一列和600.000行的文件。

这就是例子:

100
100
0
100
100
...
n=600.000

我希望每3000行拆分这些数据,在此示例旁边创建一个新列:

Col1     Col2     Col3     Col4      Col...200:
n=1      n=3001   n=6001   n=9001    ...
0        0        0        0         ...
0        0        0        0         ...
100      100      100      100       ...
...      ...      ...      ...       ...
n=3000   n=6000   n=9000   n=12000   n=600.000

n =行号。

有没有办法在 R或bash 中执行此操作?

非常感谢你。

编辑:我在python中使用这个脚本生成该列:

    from decimal import *
i = 1
while(i <= 15):
    output = open('cache/distances_'+str(i)+'.dat.results', 'w') 
    with open('cache/distances_medias_'+str(i)+'.dat', 'r') as f:
        for line in f:
            columns = line.split(' ')
            if(Decimal(columns[0]) <= 2.5 and (Decimal(columnas[1]) > 120 and Decimal(columnas[1]) < 180)):
                salida.write("100\n")
            else:
                salida.write("0\n")
    salida.close()
    i+=2

有没有办法修改脚本,当它到达第3000行时,从新列开始?

3 个答案:

答案 0 :(得分:4)

我不确定我理解你的例子,但你应该能够使用分割和粘贴的组合:

$ cat filetosplit
1
2
3
4
5
6
7
8
9
10

$ split filetosplit  "split." -l 3 -d ; paste split*
1       4       7       10
2       5       8
3       6       9

split命令将生成每行3行的文件(可以修改为3000)。粘贴将它们放在一起。您可以使用sed添加包含列名和初始编号的标题。

答案 1 :(得分:3)

在R中,您可以添加dim属性:

dim(your_vector) <- c(3000, 600000/3000)

它会将对象类更改为matrix,因此如果您需要数据框,则需要:

df <- data.frame(your_vector)

答案 2 :(得分:1)

使用awk

awk -v n=5 '{data[(NR-1)%n FS int((NR-1)/n)]=$0}
            END {cols=NR/n;
            for (i=0;i<n;i++) {
                 for (j=0;j<cols;j++) 
                      printf "%s%s", data[i FS j], FS} 
                 print ""
                 }
            }'

即:将所有内容存储在一种矩阵中,然后相应地循环。

样本输出

$ seq 15 | awk -v n=3 '{data[(NR-1)%n FS int((NR-1)/n)]=$0} END {cols=NR/n; for (i=0;i<n;i++) {for (j=0;j<cols;j++) {printf "%s%s", data[i FS j], FS} print ""}}'
1 4 7 10 13 
2 5 8 11 14 
3 6 9 12 15 
$ seq 15 | awk -v n=7 '{data[(NR-1)%n FS int((NR-1)/n)]=$0} END {cols=NR/n; for (i=0;i<n;i++) {for (j=0;j<cols;j++) {printf "%s%s", data[i FS j], FS} print ""}}'
1 8 15 
2 9  
3 10  
4 11  
5 12  
6 13  
7 14  
$ seq 15 | awk -v n=5 '{data[(NR-1)%n FS int((NR-1)/n)]=$0} END {cols=NR/n; for (i=0;i<n;i++) {for (j=0;j<cols;j++) {printf "%s%s", data[i FS j], FS} print ""}}'
1 6 11 
2 7 12 
3 8 13 
4 9 14 
5 10 15