1

2 つの大きなファイルがあります。各ファイルには 1000 列と 2000 行があります。同じ列番号が一緒になるように、ループ (R または Linux) を使用してそれらをマージしたいと思います。

ファイル a:

[,1] [,2] ... [,1000]
1    3
1    3
1    4
1    3
1    5

ファイル b:

[,1] [,2] .... [,1000]
2    7
2    8
2    9
2    10
2    11

マージ後:

[,1] [,1] [,2][,2] .... [,1000][,1000]
1  2  3  7
1  2  3  8
1  2  4  9
1  2  3  10
1  2  5  11 
4

6 に答える 6

1

さて、Gavin の助けを借りてループを使用する別の方法を次に示します。

result<-matrix(0,nrow=5,ncol=2000)
t<-0
for (i in 1:(1000)){
  t<-t+1
  result[,(2*t-1)]<-a[,t]
  result[,(2*t)]<-b[,t]
}
于 2012-11-07T19:50:49.870 に答える
1

一般的な解決策はcbind(). 検討:

a <- matrix(c(rep(1, 5),
              3,3,4,3,5), ncol = 2)
b <- matrix(c(rep(2, 5),
              7:11), ncol = 2)

cbind(a, b)

それは与える。

> cbind(a, b)
     [,1] [,2] [,3] [,4]
[1,]    1    3    2    7
[2,]    1    3    2    8
[3,]    1    4    2    9
[4,]    1    3    2   10
[5,]    1    5    2   11

表示するオブジェクトはマトリックスのように見えますが、データ フレームを使用して同じ操作を行うことができます。

例のように、列をインターリーブする特別な場合にサブセット化が役立つ場合があります

ind <- c(rbind(seq_len(ncol(a)), seq_len(ncol(b)) + ncol(a)))
cbind(a, b)[, ind]

> ind <- c(rbind(seq_len(ncol(a)), seq_len(ncol(b)) + ncol(a)))
> cbind(a, b)[, ind]
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    7
[2,]    1    2    3    8
[3,]    1    2    4    9
[4,]    1    2    3   10
[5,]    1    2    5   11
于 2012-11-07T19:56:24.293 に答える
0

ペーストとawkを使用したもう1つの迅速で汚い代替手段:

paste a b|awk 'BEGIN{cols=1000;} {line = ""; for(i=1; i<=cols; ++i) {line = line $i FS $(i + cols) FS;} print line;}'

于 2012-11-07T20:46:14.647 に答える
0
awk '
  {
    getline line < "fileb"
    split(line, ary)
    for (i=1; i<=NF; i++) {
        printf("%s%s%s%s", $i, OFS, ary[i], OFS)
    }
    print ""
  }
' filea
于 2012-11-07T21:22:29.833 に答える
0

and を使用した簡単で汚い実装を次に示しawkますpaste

#!/bin/bash

infile_a=a
infile_b=b
output_file=outfile
temp_a=tempa
temp_b=tempb
temp_out=tempout

if [[ -e $output_file ]]; then
    rm $output_file
fi

touch $output_file

total_col=1000
cur_col=1

while [[ $cur_col -le $total_col ]]
do
    awk -v col=$cur_col '{print $(col)}' $infile_a > $temp_a
    awk -v col=$cur_col '{print $(col)}' $infile_b > $temp_b
    paste $output_file $temp_a $temp_b > $temp_out
    mv $temp_out $output_file
    cur_col=$((cur_col+1))
done
于 2012-11-07T19:55:57.560 に答える
0

awk では非常にシンプルで、制限を指定したり、一時ファイルを作成したりする必要はありません。

$ awk 'NR==FNR{a[NR]=$0;next} {split(a[FNR],b); for (i in b) $i=b[i]" "$i}1' file1 file2
[,1] [,1] [,2] [,2] ... .... [,1000] [,1000]
1 2 3 7
1 2 3 8
1 2 4 9
1 2 3 10
1 2 5 11
于 2012-11-07T21:26:57.873 に答える