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

目录
  • 引言
  • which 函数的介绍
  • 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函数详解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • R语言中ifelse、which、%in%的用法详解

    ifelse.which.%in%是R语言里极其重要的函数,以后会经常在别的程序中看到. ifelse ifelse是if条件判断语句的简写,它的用法如下: ifelse(test,yes,no) 参数 描述 test 一个可以判断逻辑表达式 yes 判断为 true 后返回的对象 no 判断为 flase 后返回的对象 举例: x = 5 ifelse(x,1,0) 如果x不等于0,就返回1,等于0就返回0. which which 返回条件为真的句柄,给正确的逻辑对象返回一个它的索引. wh

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

    目录 引言 which 函数的介绍 which函数的一些小例子 which函数的改进以及时间对比 总结 引言 首先来介绍一下R语言which函数的作用:which函数在向量.矩阵.数据框,列表.因子这些数据结构中有这重要的作用,可以查找特定的元素返回其在数据中的索引,因此非常方便操作数据. which 函数的介绍 which函数中的参数: function (x, arr.ind = FALSE, useNames = TRUE) which函数的源码: which <- function(x,

  • C语言字符串函数介绍与模拟实现详解

    目录 2. strcpy(复制字符串) 2.1 strncpy函数 2.2 模拟实现strcpy 3. strcat (追加字符) 3.1 strncat 函数 3.2 模拟实现strcat 4. strcmp(比较两个字符串内容) 4.1 strncmp函数 4.2 模拟实现strcmp 5. strstr (返回str1出现在str2位置处第一次的指针) 5.1 模拟实现strstr 6. strtok(分割字符串) 总结 1. strlen(求字符串长度) 这个函数就是求一个字符串的长度.

  • R语言对数据库进行操作的实例详解

    数据是关系数据库系统以规范化格式存储. 因此,要进行统计计算,我们将需要非常先进和复杂的Sql查询. 但R语言可以轻松地连接到许多关系数据库,如MySql,Oracle,Sql服务器等,并从它们获取记录作为数据框. 一旦数据在R语言环境中可用,它就变成正常的R语言数据集,并且可以使用所有强大的包和函数来操作或分析. 在本教程中,我们将使用MySql作为连接到R语言的参考数据库. RMySQL包 R语言有一个名为"RMySQL"的内置包,它提供与MySql数据库之间的本地连接. 您可以使

  • R语言关于随机森林算法的知识点详解

    在随机森林方法中,创建大量的决策树. 每个观察被馈入每个决策树. 每个观察的最常见的结果被用作最终输出. 新的观察结果被馈入所有的树并且对每个分类模型取多数投票. 对构建树时未使用的情况进行错误估计. 这称为OOB(袋外)误差估计,其被提及为百分比. R语言包"randomForest"用于创建随机森林. 安装R包 在R语言控制台中使用以下命令安装软件包. 您还必须安装相关软件包(如果有). install.packages("randomForest") 包&qu

  • R语言学习ggplot2绘制统计图形包全面详解

    目录 一.序 二.ggplot2是什么? 三.ggplot2能画出什么样的图? 四.组装机器 五.设计图纸 六.机器的零件 1. 零件--散点图 1) 变换颜色 2) 拟合曲线 3) 变换大小 4) 修改透明度 5) 分层 6) 改中文 2. 零件--直方图与条形图 1) 直方图 2) 润色 3) 条形图 3. 零件--饼图 4. 零件--箱线图 5. 零件--小提琴图 6. 零件打磨 7. 超级变变变 8. 其他常用零件 七.实践出真知 八.学习资源 九.参考资料 一.序 作为一枚统计专业的学

  • R语言UpSet包实现集合可视化示例详解

    目录 前言 一.R包及数据 二.upset()函数 1)基本参数 2)queries参数 3)attribute.plots参数 3.1 添加柱形图和散点图 3.2 添加箱线图 3.3 添加密度曲线图 前言 介绍一个R包UpSetR,专门用来集合可视化,当多集合的韦恩图不容易看的时候,就是它大展身手的时候了. 一.R包及数据 #安装及加载R包 #install.packages("UpSetR") library(UpSetR) #载入数据集 data <- read.csv(&

  • R语言学习之线图的绘制详解

    目录 线图 单线图 多线图 横轴文本线图 线图 线图是反映趋势变化的一种方式,其输入数据一般也是一个矩阵. 单线图 假设有这么一个矩阵,第一列为转录起始位点及其上下游5 kb的区域,第二列为H3K27ac修饰在这些区域的丰度,想绘制一张线图展示. profile="Pos;H3K27ac -5000;8.7 -4000;8.4 -3000;8.3 -2000;7.2 -1000;3.6 0;3.6 1000;7.1 2000;8.2 3000;8.4 4000;8.5 5000;8.5"

  • C语言strlen函数实现读取字符串长度详解

    目录 前言 1.函数strlen 2.使用指针 3.指针改进 4.使用递归 5.my_strlen函数的参数改进—常量指针 总结 前言 读取字符串的长度,使用函数 strlen.这里我们写一个函数,来读取字符串的长度,本文内容主要包括: 使用strlen 使用指针:是常规的方法,但是要创建变量 指针改进:不需要创建变量,要求高,不易掌握 使用递归:不需要创建变量,要求高,不易掌握 介绍常量指针—— const char* str 1.函数strlen int main() { char arr[

  • Go语言中函数可变参数(Variadic Parameter)详解

    目录 基本语法 示例一:函数中获取可变参数 示例二:将切片传给可变参数 示例三:多参数 基本语法 在Python中,在函数参数不确定数量的情况下,可以使用如下方式动态在函数内获取参数,args实质上是一个list,而kwargs是一个dict def myFun(*args, **kwargs): 在Go语言中,也有类似的实现方式,只不过Go中只能实现类似*args的数组方式,而无法实现**kwargs的方式.实现这种方式,其实也是利用数组的三个点表达方式,我们这里来回忆一下. 关于三个点(…)

  • Go语言基础函数基本用法及示例详解

    目录 概述 语法 函数定义 一.函数参数 无参数无返回 有参数有返回 函数值传递 函数引用传递 可变参数列表 无默认参数 函数作为参数 二.返回值 多个返回值 跳过返回值 匿名函数 匿名函数可以赋值给一个变量 为函数类型添加方法 总结 示例 概述 函数是基本的代码块,用于执行一个任务 语法 函数定义 func 函数名称( 参数列表] ) (返回值列表]){ 执行语句 } 一.函数参数 无参数无返回 func add() 有参数有返回 func add(a, b int) int 函数值传递 fu

随机推荐