在Rcpp中 - 如何返回带有名称的向量

时间:2014-06-24 17:41:45

标签: r rcpp

假设我有以下矩阵:

testM <- as.matrix(read.table(textConnection("
1  5  4  1  3  2
2  1  5  4  1  3
2  2  1  5  4  1
3  2  2  1  5  4
1  3  2  2  1  5
4  1  3  2  2  1
1  5  4  1  3  2
2  1  5  4  1  3
2  2  1  5  4  1
3  2  2  1  5  4
1  3  2  2  1  5
4  1  3  2  2  1
")))

此矩阵的列名为V1V6

假设我有另一个矩阵删除列名:

> testM2<-testM
> colnames(testM2)<-NULL

然后,如果我在colMeanstestM上尝试testM2,则R会在两种情况下都返回numeric课程,除非在第一种情况下答案为colnames

> colMeans(testM)
      V1       V2       V3       V4       V5       V6 
2.166667 2.333333 2.833333 2.500000 2.666667 2.666667 
> colMeans(testM2)
[1] 2.166667 2.333333 2.833333 2.500000 2.666667 2.666667

现在假设我在RCpp中编写了相同的函数,如下所示:

double do_mean(NumericVector x) {
  return mean(na_omit(x));
}

//[[Rcpp::export]]
NumericVector colMeansCppMt(NumericMatrix& x) {
  int nCols=x.ncol();
  NumericVector out=no_init(nCols);
  for (int i=0;i<nCols;i++) {
    NumericMatrix::Column tmp=x(_,i);
    out[i]=do_mean(tmp);
  }
  return out;
}

colMeansCppMttestM的{​​{1}}输出会返回数字向量,但testM2的输出不包含testM,因为它没有&# 39;已经设定。

现在,假设我将colnames函数更改为包含如下属性:

colMeansCppMt

//[[Rcpp::export]] NumericVector colMeansCppMt(NumericMatrix& x) { int nCols=x.ncol(); NumericVector out=no_init(nCols); for (int i=0;i<nCols;i++) { NumericMatrix::Column tmp=x(_,i); out[i]=do_mean(tmp); } out.attr("names")=x.attr("names"); return out; } 的输出仍然是一个不包含列名的向量。

我还尝试了testMout.attr("names")=x.attr("colnames")

A)。如何在RCpp中检查矩阵的out.attr("colnames")=x.attr("colnames")(例如上面示例函数中的colnames)的位置?

B)。如何在R中返回名称为Rcpp?

的数字向量

1 个答案:

答案 0 :(得分:3)

设置格局:

  1. 常规R向量具有(可选)names属性,
  2. data.frame对行有row.names属性,列有names属性,
  3. matrix具有(可选)dimnames属性;此属性是list,包含2个字符向量(行然后是列)。
  4. 所以你想要的是附加在&#39;名称&#39;上的x的列名。 out的属性,如下所示:

    out.attr("names") = VECTOR_ELT(x.attr("dimnames"), 1);
    

    会起作用。

    (我不记得Rcpp是否有一个很好的API来获取/设置数组中的维名称...)