如何将数据框中的一列合并到同一数据框中的另一列?
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
我一直在寻找这个页面,但我刚刚找到 cbind
和 rbind
选项
但不要给我我想要的。
您似乎想要堆叠每一对列。在下面的代码中,我们只是将第 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)]))
所以,我想将一列合并到底部的另一列中。这就是我的数据的样子:
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
我一直在寻找这个页面,但我刚刚找到 cbind
和 rbind
选项
但不要给我我想要的。
您似乎想要堆叠每一对列。在下面的代码中,我们只是将第 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)]))