我正在使用蛋白质轨迹,我有一个很长的数据框架。 (带有一列和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行时,从新列开始?
答案 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