是否有R函数可返回向量的任何值的排序索引?

帕斯卡

我不太熟练R data.table,为解决以下问题,将不胜感激任何帮助!我有大的data.table(〜1000000行),其中包含数值列,我想输出相同维度的data.table,其中每个行值的索引位置都排序。

一个简短的例子:

输入

dt = data.frame(ack = 1:7)

dt$A1 = c( 1,    6,  9,  10,  3,   5, NA)
dt$A2 = c( 25,  12, 30,  10, 50,   1, 30)
dt$A3 = c( 100, 63, 91, 110,  1,   4, 10)
dt$A4 = c( 51,  65,  2,   1,  0, 200,  1)

第一行:1(1)<= 25(2)<= 51(3)<= 100(4),1、25、100、51)的行排序索引位置为(1、2、4、3)输出应为:

dt$PosA1 = c(1, ...
dt$PosA2 = c(2, ...
dt$PosA3 = c(4, ...
dt$PosA4 = c(3, ...

第三行:2(1)<= 9(2)<= 30(3)<= 91(4),必须输出:

dt$PosA1 = c( 1,1,2,...)
dt$PosA2 = c( 2,2,3,...)
dt$PosA3 = c( 4,3,4,...)
dt$PosA4 = c( 3,4,1,...)

输出是输入data.table的相同维度,其中填充了按行排序的索引值。

dt$PosA1 = c( 1, 1, 2, 2, 3, 1, NA)
dt$PosA2 = c( 2, 2, 3, 3, 4, 2, 3)
dt$PosA3 = c( 4, 3, 4, 4, 2, 2, 2)
dt$PosA4 = c( 3, 4, 1, 1, 1, 4, 1)

我想也许是这样的吗?

library(data.table)
setDT(dt)

# pseudocode
dt[, PosA1 := rowPosition(.SD, 1, na.rm=T),
     PosA2 := rowPosition(.SD, 2, na.rm=T),
     PosA3 := rowPosition(.SD, 3, na.rm=T),
     PosA4 := rowPosition(.SD, 4, na.rm=T),
     .SDcols=c(A1, A2, A3, A4)]

我不确定语法,我想念rowPosition函数。是否有任何功能可以做到这一点?(我在这里将其命名为rowPosition)

编写一些有效的方法或其他解决问题的方法,对您有所帮助。

问候。

chinsoon12

由于您正在寻找速度,因此您可能要考虑使用Rcpp。一个RCPPrank该负责NA和关系可以发现nrussell的改编的勒内·里希特的代码版本

nr <- 811e3
nc <- 16
DT <- as.data.table(matrix(sample(c(1:200, NA), nr*nc, replace=TRUE), nrow=nr))[, 
    ack := .I]

#assuming that you have saved nrussell code in avg_rank.cpp
library(Rcpp)
system.time(sourceCpp("rcpp/avg_rank.cpp"))
#   user  system elapsed 
#   0.00    0.13    6.21 

nruss_rcpp <- function() {
    DT[, as.list(avg_rank(unlist(.SD))), by=ack]
}

data.table.frank <- function() {
    melt(DT, id="ack")[, f := frank(value, na.last="keep", ties.method="dense"), by=ack][, 
        dcast(.SD, ack ~ variable, value.var="f")]
}


library(microbenchmark)
microbenchmark(nruss_rcpp(), data.table.frank(), times=3L)

时间:

Unit: seconds
               expr       min        lq     mean   median        uq       max neval cld
       nruss_rcpp()  10.33032  10.33251  10.3697  10.3347  10.38939  10.44408     3  a 
 data.table.frank() 610.44869 612.82685 613.9362 615.2050 615.68001 616.15501     3   b

编辑:解决评论

1)使用引用更新为等级列设置列名

DT[, (paste0("Rank", 1L:nc)) := as.list(avg_rank(unlist(.SD))), by=ack]

2)保持NA不变

选项A)avg_rank以下位置获取输出后,将R中的NA更改为

for (j in 1:nc) {
    DT[is.na(get(paste0("V", j))), (paste0("Rank", j)) := NA_real_]
}

选项B)修改avg_rankRcpp中代码,如下所示:

Rcpp::NumericVector avg_rank(Rcpp::NumericVector x)
{
    R_xlen_t sz = x.size();
    Rcpp::IntegerVector w = Rcpp::seq(0, sz - 1);
    std::sort(w.begin(), w.end(), Comparator(x));

    Rcpp::NumericVector r = Rcpp::no_init_vector(sz);
    for (R_xlen_t n, i = 0; i < sz; i += n) {
        n = 1;
        while (i + n < sz && x[w[i]] == x[w[i + n]]) ++n;
        for (R_xlen_t k = 0; k < n; k++) {
            if (Rcpp::traits::is_na<REALSXP>(x[w[i + k]])) {  #additional code
                r[w[i + k]] = NA_REAL;                        #additional code
            } else {
                r[w[i + k]] = i + (n + 1) / 2.;
            }
        }
    }

    return r;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

排序后如何返回向量的索引

来自分类Dev

从函数返回向量

来自分类Dev

从函数返回向量

来自分类Dev

函数返回向量最高值的前5个索引

来自分类Dev

如何返回向量的索引?

来自分类Dev

在 R 中,假设有多个条件向量,如何返回向量中的索引向量?

来自分类Dev

从函数自动返回向量

来自分类Dev

从函数返回向量指针

来自分类Dev

从函数C ++返回向量

来自分类Dev

R 向量 - 如果向量由最小值/最大值定义,则返回向量的所有项

来自分类Dev

传入函数后返回向量中的值

来自分类Dev

R:为什么我没有获得按预期返回向量的函数?

来自分类Dev

R 不会返回向量

来自分类Dev

从函数返回向量并更新向量的对象

来自分类Dev

如何返回向量的2个索引?

来自分类Dev

如何返回向量中元素的索引

来自分类Dev

传递一个按值返回向量的函数作为 ublas::element_prod() 的参数有什么问题?

来自分类Dev

C++ - 无法从函数返回向量

来自分类Dev

如何从Rust函数返回向量元素?

来自分类Dev

专门模板函数返回向量

来自分类Dev

从函数返回向量以打印内容

来自分类Dev

如何使类中的函数返回向量?

来自分类Dev

是否有R函数来查找向量中元素的索引?

来自分类Dev

是否有一个numpy函数用于根据具有索引的向量进行排序?

来自分类Dev

返回向量元素

来自分类Dev

如何返回向量?

来自分类Dev

在R的相关列中返回向量和字符串中的最大值

来自分类Dev

从C ++中的函数返回向量的最佳方法是什么

来自分类Dev

返回向量的循环函数中的clojure变量分配