广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >R语言which函数介绍及Rcpp改写详解
  • 953
分享到

R语言which函数介绍及Rcpp改写详解

2024-04-02 19:04:59 953人浏览 八月长安
摘要

目录引言which 函数的介绍which函数的一些小例子which函数的改进以及时间对比总结引言 首先来介绍一下R语言which函数的作用:which函数在向量、矩阵、数据框,列表、

引言

首先来介绍一下R语言which函数的作用:which函数在向量、矩阵、数据框,列表、因子这些数据结构中有这重要的作用,可以查找特定的元素返回其在数据中的索引,因此非常方便操作数据。

which 函数的介绍

which函数中的参数:

function (x, arr.ind = FALSE, useNames = TRUE)

which函数的源码

which <- function(x, arr.ind = FALSE, useNames = TRUE)
{
wh <- .Internal(which(x))
if (arr.ind && !is.null(d <- dim(x)))
arrayInd(wh, d, dimnames(x), useNames=useNames) else wh
}
arrayInd <- function(ind, .dim, .dimnames = NULL, useNames = FALSE) {
##-- return a matrix length(ind) x rank == length(ind) x length(.dim)
m <- length(ind)
rank <- length(.dim)
wh1 <- ind - 1L
ind <- 1L + wh1 %% .dim[1L]
dnms <- if(useNames) {
list(.dimnames[[1L]][ind],
if(any(nzchar(nd <- names(.dimnames)))) nd else
if(rank == 2L) c(“row”, “col”) # for matrices
else paste0(“dim”, seq_len(rank)))
}
ind <- matrix(ind, nrow = m, ncol = rank, dimnames = dnms)
if(rank >= 2L) {
denom <- 1L
for (i in 2L:rank) {
denom <- denom * .dim[i-1L]
nextd1 <- wh1 %/% denom # (next dim of elements) - 1
ind[,i] <- 1L + nextd1 %% .dim[i]
}
}
storage.mode(ind) <- “integer”
ind
}

供给想改进的同学学习

which函数的一些小例子

1

x <- sample(1:10,25,T)

x的值: 10 9 3 10 9 9 10 10 3 10 7 9 9 7 2 4 2 8 8 5 4 7 3 8 4

which(x == 10)

10在向量x中的位置:1 4 7 8 10

给向量x命名,测试一下useNames = TRUE是否起作用!

names(x) <- letters[1:25]
which(x == 10,useNames = FALSE)
which(x == 10,useNames = TRUE)

然而并没有什么卵用!

2

a <- matrix(rep(1:3,times = c(3,3,3)),3,3)
which(a == 1,arr.ind = T)
which(a == 1,arr.ind = F)
which(a == 1,arr.ind = T,useNames = TRUE)
which(a == 1,arr.ind = F,useNames = FALSE)

结果:

which函数的改进以及时间对比

针对向量版本的我这里就不展示了!

根据矩阵中的某个元素返回其在矩阵中的位置!

Rcpp代码

sourceCpp(code = '
            #include <RcppArmadillo.h>
         //[[Rcpp::depends("RcppArmadillo")]]
         //[[Rcpp::export]]
       arma::mat whicha(arma::mat matrix,int what){
          arma::uvec out;//查找索引值
          out = find(matrix == what);//查找索引值(从0开始)
          int n = matrix.n_rows; //行数
          int nl = out.n_elem; //查找元素总数
          
          arma::vec foo;
          arma::mat out1(nl,2);  //输出矩阵
          
       foo = arma::conv_to<arma::vec>::from(out); //查找值所在的向量索引
        out1.col(1) = floor(foo / n)+1;
        for(int i = 0;i < nl;i++){
            out1(i,0) = floor(out(i) % n)+1;}
        return out1;  }   ')

时间对比:

library(microbenchmark)

microbenchmark(which(z == 1,arr.ind = T),
               whicha(z,1) )

总结

到此这篇关于R语言which函数介绍及Rcpp改写的文章就介绍到这了,更多相关R语言which函数详解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: R语言which函数介绍及Rcpp改写详解

本文链接: https://www.lsjlt.com/news/154042.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • R语言which函数介绍及Rcpp改写详解
    目录引言which 函数的介绍which函数的一些小例子which函数的改进以及时间对比总结引言 首先来介绍一下R语言which函数的作用:which函数在向量、矩阵、数据框,列表、...
    99+
    2022-11-13
  • R语言函数详解及实例用法
    函数是一组组合在一起以执行特定任务的语句。 R 语言具有大量内置函数,用户可以创建自己的函数。 在R语言中,函数是一个对象,因此R语言解释器能够将控制传递给函数,以及函数完成动作所需...
    99+
    2022-11-12
  • C语言字符串函数介绍与模拟实现详解
    目录2. strcpy(复制字符串)2.1 strncpy函数2.2 模拟实现strcpy3. strcat (追加字符)3.1 strncat 函数3.2 模拟实现strcat4....
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作