假设我有以下矩阵:
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
")))
此矩阵的列名为V1
到V6
假设我有另一个矩阵删除列名:
> testM2<-testM
> colnames(testM2)<-NULL
然后,如果我在colMeans
和testM
上尝试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;
}
colMeansCppMt
和testM
的{{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;
}
的输出仍然是一个不包含列名的向量。
我还尝试了testM
和out.attr("names")=x.attr("colnames")
。
A)。如何在RCpp中检查矩阵的out.attr("colnames")=x.attr("colnames")
(例如上面示例函数中的colnames
)的位置?
B)。如何在R中返回名称为Rcpp?
的数字向量答案 0 :(得分:3)
设置格局:
names
属性,data.frame
对行有row.names
属性,列有names
属性,matrix
具有(可选)dimnames
属性;此属性是list
,包含2个字符向量(行然后是列)。所以你想要的是附加在&#39;名称&#39;上的x
的列名。 out
的属性,如下所示:
out.attr("names") = VECTOR_ELT(x.attr("dimnames"), 1);
会起作用。
(我不记得Rcpp
是否有一个很好的API来获取/设置数组中的维名称...)