[英]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.