2016-08-12 66 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 
相关问题