2016-08-12 6 views
0

だから、別の列の1つの列を下に併合したいと思います。データフレームの列を同じデータフレームの別の列にマージする方法はありますか?

V1  V2  V3  V4 
-75.6364 -33.3363 -68.6320 -35.7657 
-62.4546 -42.6754 -60.0532 -41.7773 
-53.1363 -48.3385 -56.0956 -47.4524 
-51.9633 -37.6143 -60.3062 -54.7817 

そして、私は、これを持っているとV1-V3とV2-V4をマージしたい::

V1  V2  

-75.6364 -33.3363 
-62.4546 -42.6754  
-53.1363 -48.3385 
-51.9633 -37.6143 
-68.6320 -35.7657 
-60.0532 -41.7773 
-56.0956 -47.4524 

私は、このページで探していたが、私はちょうど見つけたことは、私のデータがどのように見えるかですcbindrbindのオプション でも、私が望むものは提供していません。

+0

見てみましょう'dplyr'パッケージの' join'や基底Rからの 'merge'のようになります。 – shayaa

+0

V3とV4の列の上に列V1とV2を積み重ねているようです。そうですか? – eipi10

+0

希望の出力に8行目がないと思います。 – alistaire

答えて

3

他の回答は役に立ちますが、それぞれに、あなたは文字通りの列の各ペアでコーディングする必要があります。ここでは、以下の10個の列を持つタフな例と一般的な機能である:アナンダの技術in this questionを使用して

dfSeq <- function(df) Map(':', 1:(ncol(df)-1), 2:ncol(df))[c(TRUE,FALSE)] 
stackDF <- function(df1) do.call('rbind', Map(function(x,y) 
       setNames(x[y], names(df1)[1:2]), list(df1), dfSeq(df1))) 


mydf <- as.data.frame(replicate(10, rnorm(10))) 
dim(mydf) 
[1] 10 10 

stackDF(mydf) 
#    V1   V2 
# 1 1.031131668 -1.00884258 
# 2 1.803293498 2.15713217 
# 3 -1.295998573 0.20951434 
# 4 -1.314269143 1.56329500 
# 5 -1.138388270 -0.87029891 
# 6 -1.312514370 0.31815244 
# 7 1.436570621 -0.96508931 

編集

は、我々はワンライナーを作成することができます。

data.frame(V1=unlist(mydf[c(T,F)]), V2=unlist(mydf[c(F,T)])) 
2

各列のペアを積み重ねるように見えます。所望に応じて下記のコードでは、我々は、ちょうどrbindが動作するように、列1及び2と同じになるように、列3と4の名前を変更:

new.df = rbind(df[,1:2], setNames(df[,3:4], names(df[,1:2]))) 

new.df 
 V1  V2 
1 -75.6364 -33.3363 
2 -62.4546 -42.6754 
3 -53.1363 -48.3385 
4 -51.9633 -37.6143 
5 -68.6320 -35.7657 
6 -60.0532 -41.7773 
7 -56.0956 -47.4524 
8 -60.3062 -54.7817 
3

data.table年代melt関数は、パラレル列にグループ化するためのパラメータを取ることができる点で特に優れています。 variable識別子列が挿入されますが、サブセット化することができます。基地Rで

library(data.table) 

melt(setDT(df),        # set df to a data.table 
    measure.vars = list(c(1,3), c(2,4)), # set column groupings 
    value.name = 'V')[      # set output name scheme 
     , -1, with = F]      # subset out variable column 
##   V1  V2 
## 1: -75.6364 -33.3363 
## 2: -62.4546 -42.6754 
## 3: -53.1363 -48.3385 
## 4: -51.9633 -37.6143 
## 5: -68.6320 -35.7657 
## 6: -60.0532 -41.7773 
## 7: -56.0956 -47.4524 
## 8: -60.3062 -54.7817 

stack関数は、並列カラムの長いが、ないように溶融します。しかし、列名を添え字に変えてunstackにするか、rep(rep(1:2, each = 4), 2)のような手で適切なベクトルを作ることができます。

df2 <- stack(df) 
# change ind (variable/key/index) column to number, take modulo 2 to separate even/odd, 
# and invert 0/1 add 1 to make better column names 
df2$ind <- 1 + !as.numeric(df2$ind) %% 2 
unstack(df2) 
##   X1  X2 
## 1 -75.6364 -33.3363 
## 2 -62.4546 -42.6754 
## 3 -53.1363 -48.3385 
## 4 -51.9633 -37.6143 
## 5 -68.6320 -35.7657 
## 6 -60.0532 -41.7773 
## 7 -56.0956 -47.4524 
## 8 -60.3062 -54.7817 
関連する問題