如何将数据框中的一列合并到同一数据框中的另一列?

How can I merge a column from data frame to another column from the same data frame?

所以,我想将一列合并到底部的另一列中。这就是我的数据的样子:

    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 选项 但不要给我我想要的。

您似乎想要堆叠每一对列。在下面的代码中,我们只是将第 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

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

在 base 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

其他答案很有帮助,但在每个答案中,您都必须按字面意思在每对列中进行编码。这是一个广义函数,下面有十列的更严格的例子:

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

编辑

使用 Ananda 的技术 ,我们可以创建一个单线:

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