gpt4 book ai didi

r - 如何处理Rcpp中的因素

转载 作者:行者123 更新时间:2023-12-01 12:43:53 26 4
gpt4 key购买 nike

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

c对象进入fun()在代码的底部,我希望它输出一个向量/数组,其值为“Home”、“Elsewhere”或“Number”。

我发现这里的数据类型有点令人困惑。我的原始数据集是一个因素。如果我把它放入 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)

最佳答案

注:自始至终,我都会引用f ,不是 c .将变量命名为与内置函数或常量相同的名称是不好的做法,例如 c , T , 或 F .因此,我将代码的开头更改如下:

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() 从 C++ 中获得它。 Rcpp::IntegerVector的成员函数:

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 (尽管您完全正确地认为输入应该是 IntegerVector )
  • 使用 CharacterVector levs = x.attr("levels"); 获取因子的水平
  • 比较 levs[x[i]-1]"H"等,而不是 x[i] -- x[i]将始终是一个整数,给出它对应的水平向量的元素。我们做 -1因为 C++ 是 0-indexed 而 R 是 1-indexed。

  • 其他注意事项:

    正如您所说,很明显,“[您] 正在尝试学习如何在 R 中使用 Rcpp()。”您肯定想花一些时间在诸如 Rcpp for Everyone 之类的资源上。 (这是关于因素的章节), Rcpp Gallery (这个具体链接是一篇关于因素的文章), Hadley's chapter on Rcpp ,当然还有可用的 Rcpp 小插图 here .

    关于r - 如何处理Rcpp中的因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55648946/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com