2016-08-12 38 views
0

所以,我想合併底部另一列中的一列。這就是我的數據看起來像:如何將數據框中的列合併到同一數據框中的另一列?

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'或者base R的'merge'中。 – shayaa

+0

看起來您想要在列V3和V4的頂部堆疊列V1和V2。是對的嗎? – eipi10

+0

我認爲所需的輸出缺少第8行。 – alistaire

回答

3

其他答案是有幫助的,但是在每一個答案中,你都必須在每一列中逐字地編碼。下面是用低於十列強硬例如一個廣義函數:

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 

編輯

使用阿南達的技術in this question,我們可以創建一個班輪:

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

它看起來像你想疊加每對列。在下面的代碼中,我們只需要改變第3,4列的名稱是一樣的1和2列,使rbind將工作所需:

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標識符列,但是你可以將它列出。

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 

在基R,所述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 
相關問題