如何处理Rcpp中的因素

时间:2019-04-12 09:50:08

标签: r rcpp

我正在尝试学习如何在R中使用Rcpp。有人可以指出 找出此代码存在的问题。可能不止一个 问题。

当在代码底部的c对象中输入fun()时,我希望它输出带有值“ Home”,“ Elsewhere”或“ Number”的向量/数组。 / p>

我在这里发现数据类型有些混乱。我的原始数据集是一个因素。如果我将其放入storage.mode(),它将返回integer。我假设那时我必须将x自变量分配为IntegerVector。这使我感到困惑,因为数据包含字母,即“ H”和“ E”,那么数据如何是整数? 当我在if语句中说==“ H”时,我不知道它是否理解我的意思。


library(Rcpp)

c <- factor(c("E", "H", "E", "12", "10", "60", "80", "11", "H", "H"))
class(c)
storage.mode(c)

cppFunction(' IntegerVector fun(IntegerVector x){

            // creates an empty character vector the size/length of x.
            CharacterVector y = x.size() ;


            int n = x.size() - 1 ;


            //loop
            for(int i = 0; i <= n; i = i + 1){

            if(x[i] == "H"){
            y[i] = "Home" ;

            }else if(x[i] == "E"){
            y[i] = "Elsewhere" ;
            }else{
            y[i] = "Number" ;
            } ;


            }



            return y ;

            }')


fun(c)

1 个答案:

答案 0 :(得分:4)

注意:在整个过程中,我将参考f,而不是c。不好的做法是将变量命名为与内置函数或常量相同的变量,例如cTF。因此,我将代码的开头更改如下:

library(Rcpp)

f <- factor(c("E", "H", "E", "12", "10", "60", "80", "11", "H", "H"))

除了查看class(f)storage.mode(f)之外,查看str(f)也很有用:

str(f)
# Factor w/ 7 levels "10","11","12",..: 6 7 6 3 1 4 5 2 7 7

实际上,因子是具有“级别”的整数向量:对应于每个唯一整数值​​的字符向量。幸运的是,您可以使用.attr()的{​​{1}}成员函数从C ++中获得它:

Rcpp::IntegerVector

因此,要获得想要的东西,您必须做三件事:

  1. 将返回类型从cppFunction('CharacterVector fun(IntegerVector x){ // creates an empty character vector the size/length of x. CharacterVector y = x.size() ; // Get the levels of x CharacterVector levs = x.attr("levels"); int n = x.size() - 1 ; //loop for(int i = 0; i <= n; i = i + 1){ if(levs[x[i]-1] == "H"){ y[i] = "Home" ; }else if(levs[x[i]-1] == "E"){ y[i] = "Elsewhere" ; }else{ y[i] = "Number" ; } ; } return y ; }') fun(f) # [1] "Elsewhere" "Home" "Elsewhere" "Number" "Number" "Number" # [7] "Number" "Number" "Home" "Home" 更改为IntegerVector(尽管您完全正确地认为输入应为CharacterVector
  2. 使用IntegerVector
  3. 获取因子水平
  4. 比较CharacterVector levs = x.attr("levels");levs[x[i]-1]等,而不是"H"x[i]始终是整数,给出与之对应的水平向量的元素。我们这样做x[i],因为C ++的索引为0,R的索引为1。

其他说明:

正如您所说,很明显,“ [您正在尝试学习如何在R中使用Rcpp()”。您肯定会想花一些时间来学习诸如Rcpp for Everyone(这是有关因素的章节),Rcpp Gallery(这是有关因素的文章),Hadley's chapter on Rcpp和肯定是here可用的Rcpp小插曲。