3

如果我像这样制作一个矩阵;

m<-matrix(1,dimnames=list('row','column'))
    柱子
第 1 行

我可以像这样用 rbind 添加一个新行

m<-rbind(m,row2=2)
     柱子
第 1 行
第 2 行 2

但是......如果我有一个字符串变量,比如

tag<-"row3"

为什么我不能使用 rbind 作为

m<-rbind(m,tag=3)

row3 应该在哪里而不是标记为

     柱子
第 1 行
第 2 行 2
标签 3

但想要

     柱子
第 1 行
第 2 行 2
第 3 行 3
4

3 回答 3

4

您可以只使用rbind而不命名新行,然后使用rownames来命名该行:

m <- rbind(m,3)
rownames(m)[3]<-tag

这和@agstudy 的解决方案之间的一些基准测试:

m <- matrix(1,dimnames=list('row','column'))
m <- rbind(m,row2=2)
tag <- "row3"

fn1<-function(m,tag){
  m <- rbind(m,matrix(3,dimnames=list(tag,'column')))
  m
}

fn2<-function(m,tag){
  m <- rbind(m,3)
  rownames(m)[3]<-tag
  m
}
library(microbenchmark)
microbenchmark(fn1(m,tag),fn2(m,tag))
Unit: microseconds
        expr    min     lq median     uq    max neval
 fn1(m, tag)  4.665  5.598  6.065  6.532 15.862   100
 fn2(m, tag) 11.663 13.062 13.063 13.530 48.517   100
于 2013-03-12T19:42:31.770 回答
3

您可以通过创建一个具有正确名称的矩阵来做到这一点

m <- matrix(1,dimnames=list('row','column'))
m <- rbind(m,row2=2)
tag <- "row3"
m <- rbind(m,matrix(3,dimnames=list(tag,'column')))

m
     column
row       1
row2      2
row3      3
于 2013-03-12T18:56:09.787 回答
2

由于substitute() 不处理函数参数,在这种情况下模拟动态变量名的唯一方法是eval(parse(...))

> m <- eval(parse(text=paste("rbind(m,",tag,"=3)")))
> m
     column
row       1
row2      2
row3      3

这很怪异,我不会推荐它,但为了完整起见,我将其发布。

于 2013-03-12T21:15:16.107 回答