列中的列绑定并命名列

时间:2015-08-05 06:17:19

标签: r

我想cbind mydf [," c"]并在一步中为其命名newcolumn并获取结果矩阵mydf。我该怎么做?

mydf
# a b c 
# 1 2 6
# 1 3 4


mydf
# a b c newcolumn
# 1 2 6         6
# 1 3 4         4

3 个答案:

答案 0 :(得分:6)

您可以在调用cbind

时指定新列名称
mydf <- cbind(mydf, newcolumn=mydf[,"c"])
mydf
#      a b c newcolumn
# [1,] 1 2 6         6
# [2,] 1 3 4         4

数据(使用相同的方法构建):

mydf <- cbind(a=c(1, 1), b=c(2, 3), c=c(6, 4))

如果您有数据框而不是矩阵,则可以执行mydf$newcolumn <- mydf$c

答案 1 :(得分:2)

您可以采取多种方法:

mydf <- data.frame(a=c(1,1),b=c(2,3),c=c(6,4));
mydf;
##   a b c
## 1 1 2 6
## 2 1 3 4
data.frame(mydf,newcolumn=mydf$c);
##   a b c newcolumn
## 1 1 2 6         6
## 2 1 3 4         4
cbind(mydf,newcolumn=mydf$c);
##   a b c newcolumn
## 1 1 2 6         6
## 2 1 3 4         4
transform(mydf,newcolumn=c);
##   a b c newcolumn
## 1 1 2 6         6
## 2 1 3 4         4
within(mydf,newcolumn <- c);
##   a b c newcolumn
## 1 1 2 6         6
## 2 1 3 4         4
mydf$newcolumn <- mydf$c;
mydf;
##   a b c newcolumn
## 1 1 2 6         6
## 2 1 3 4         4

在上面显示的5种方法中,只有最后一种实际修改了mydf。对于其他4,您必须将mydf分配给返回值,以将其替换为具有附加列的新data.frame。

library('microbenchmark');
bind.df <- function() mydf <- data.frame(mydf,newcolumn=mydf$c);
bind.cb <- function() mydf <- cbind(mydf,newcolumn=mydf$c);
bind.tr <- function() mydf <- transform(mydf,newcolumn=c);
bind.wi <- function() mydf <- within(mydf,newcolumn <- c);
bind.as1 <- function() mydf$newcolumn <- mydf$c;
bind.as2 <- function() mydf['newcolumn'] <- mydf['c'];
bind.as3 <- function() mydf[,'newcolumn'] <- mydf[,'c'];
bind.as4 <- function() mydf[['newcolumn']] <- mydf[['c']];
N <- 1e5; mydf <- data.frame(a=rep(c(1,1),N),b=rep(c(2,3),N),c=rep(c(6,4),N));
microbenchmark(bind.df(),bind.cb(),bind.tr(),bind.as1(),bind.as2(),bind.as3(),bind.as4(),times=1e4);
## Unit: microseconds
##        expr     min      lq      mean  median      uq       max neval
##   bind.df()  97.077 112.046 128.66080 121.027 134.711  1690.513 10000
##   bind.cb()  86.814 100.927 117.14364 109.907 122.737  1849.172 10000
##   bind.tr() 105.203 120.171 138.90802 131.290 145.830  1680.250 10000
##  bind.as1()  12.402  20.100  23.35085  22.239  25.660   148.397 10000
##  bind.as2() 370.776 412.686 596.47901 425.088 449.036 41799.239 10000
##  bind.as3() 347.682 385.743 564.78320 396.435 419.528 42144.355 10000
##  bind.as4()  17.534  26.087  30.09639  28.654  32.930   638.915 10000

答案 2 :(得分:0)

如果有两列,并且您想逐列添加两列,则在数据帧类型中使用cbind。 dapu <-cbind(data.frame(data_r),data.frame(data_c))