2017-09-12 15 views
3

同じサイズのデータ​​セットが2つあります[132,450000]。 1つは値を持ち、もう1つはそれらの値に対応するp値を持つ。今私はそれらの2つのデータセットを結合して、1つの大きなデータフレーム[264,450000]に値のある列と、それに対応するp値の列が続きます。 rownamesはまったく同じであり、カラム名は次のようにされています。たとえば、DF2同じサイズの2つのデータフレームを1列ずつ結合します。

でDF1とsample1_pvalでSAMPLE1私は2つのデータフレームを持っているこの

> df1 
    x y 
cg1 1 a 
cg2 2 b 
cg3 3 c 
cg4 4 d 
cg5 5 e 

> df2 
    x_pval y_pval 
cg1 6  f 
cg2 7  g 
cg3 8  h 
cg4 9  i 
cg5 10  j 

が好きで、私はこの順序でそれらをマージしたい:第1回DF2などなどの2列目に続くDF1の2列目に続くDF2の第1列に続いてDF1の列.....

だから、それは次のようになります。

> df 
      x  x_pval y  y_pval 
cg1  1  6  a  f 
cg2  2  7  b  g 
cg3  3  8  c  h 
cg4  4  9  d  i 
cg5  5  10  e  j 

私は両方のデータフレームで同じなので、私は後で追加することができるrownames列名を維持したい。私は大規模なデータセットを扱っているので、すべての列を入力して "cbind"を使いたいとは思っていません。そして、私は一度に各データセットから1つの列を行う "マージ"のコードを見つけることができませんでした......

これを行う数式またはパッケージはありますか?

私を助けることができる人は誰ですか?

+0

列の順序は重要ではなぜ? – zx8754

+1

私はこのフォーマットと注文のどこかに自分のデータを提出しなければなりません。私はcsvファイルを正しい順序でエクスポートする準備を整えました。 –

答えて

1

別のオプションは、両方のデータセットの列の順序を連結order、その後cbind

cbind(df1, df2)[order(c(seq_along(df1), seq_along(df2)))] 
# x x_pval y y_pval 
#cg1 1  6 a  f 
#cg2 2  7 b  g 
#cg3 3  8 c  h 
#cg4 4  9 d  i 
#cg5 5  10 e  j 
1

あなたの列は常にあなたの例のように構成されていた場合はひとつのアイデアは、与えるすなわち

dd <- cbind(df1, df2) 
dd[order(sub('_.*', '', names(dd)))] 

cbindにカラム名プレフィックスのデータフレームとorderある

x x_pval y y_pval 
cg1 1  6 a  f 
cg2 2  7 b  g 
cg3 3  8 c  h 
cg4 4  9 d  i 
cg5 5  10 e  j 

これも機能します。

data.frame(dd[c(TRUE, FALSE)], dd[c(FALSE, TRUE)]) #dd taken from above 
+0

これらのオプションは両方ともブロックにまとめられているようです。最初のものは12のブロックで、2番目のブロックは66のブロックです。助けてくれてありがとう!それは今解決されています:) –

1

%%を使用して列の順序を変更して、奇数/偶数列番号を付けることができます。

EDIT。
このアイデアは悪いことが判明しました。元のコードは修復できずにバグがありました。 の後、orderを使用して@Sotosによる解決策を見て、c(TRUE, FALSE)の使用に関する彼のコメントは、インスピレーションを受けていますが、それと同等ではない解決策を投稿することに決めました。ここにあります。

altern <- function(m, n){ 
    order(c(which(rep(c(TRUE, FALSE), m)), which(rep(c(FALSE, TRUE), n)))) 
} 

df3 <- cbind(df1, df2) 
n <- seq_along(names(df3)) 
df3 <- df3[, n[altern(ncol(df1), ncol(df2))]] 
df3 

ご覧のとおり、この解決策は最も複雑です。

+0

これは、それらをブロックにまとめるようです。最初に66列の値を取得し、次に66列のpvaluesを取得します。あなたの助けをありがとう:)それは今解決されました –

+0

@FleurPeters私はあなたが投稿したサンプルデータを扱います。コードの最後の3行目を実行していますか? –

+0

はい、私の事例はあまり良くないと思います。申し訳ありません。データは[132,450000]の次元を持ちますので、私は単純な例を作りたいと思います。 4つの列を持つdfを使用してコードを作成すると、コードも機能しません。たぶん、2列のdfで..... –

1

それとも、ソートを回避したい場合にすることです:

cbind(df1, df2)[rep(seq_along(df1),each=2)+rep(c(0,ncol(df1)),ncol(df1))] 
関連する問題