有的时候我们需要找到一个数据子向量中的位置,我们就可以使用which函数,下面这篇文章主要给大家介绍了关于R语言which函数介绍及Rcpp改写的相关资料,需要的朋友可以参考下
引言
首先来介绍一下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函数详解内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:R语言which函数介绍及Rcpp改写详解
基础教程推荐
- R包ggtreeExtra绘制进化树 2022-12-14
- R语言数可视化Split violin plot小提琴图绘制方法 2022-12-10
- swift 字符串String的使用方法 2023-07-05
- R语言基于Keras的MLP神经网络及环境搭建 2022-12-10
- Go web部署报错panic: listen tcp xxxxxxx:8090: bind: cannot assign requested address 2023-09-05
- R语言-如何将科学计数法表示的数字转化为文本 2022-11-23
- swift版webview加载网页进度条效果 2023-07-05
- asm基础——汇编指令之in/out指令 2023-07-06
- ruby-on-rails-使用Nginx的Rails的多阶段环境 2023-09-21
- UEFI开发基础HII代码示例 2023-07-07