簡體   English   中英

如何在特定范圍內拆分列?

[英]How can I split a column in a specific range?

我正在研究蛋白質的軌跡,並且數據框很長。 (具有一欄和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行時,請從新列開始?

我不確定我是否理解您的示例,但是您應該可以結合使用分割和粘貼:

$ 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添加帶有列名和初始編號的標題。

在R中,您可以添加一個dim屬性:

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

它將對象類更改為matrix ,因此,如果需要數據框架,則需要:

df <- data.frame(your_vector)

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM