c++ - R 数据框和 c++ 中的 which.min() 等价物

标签 c++ r rcpp

我正在将 R 代码翻译成 C++,我想找到一个等效的(最佳)结构,它允许与数据框进行相同类型的操作,但在 C++ 中。

操作是:

  • 添加元素(行)
  • 从索引中删除元素(行)
  • 获取最低值的索引

例如:

a <- data.frame(i = c(4, 9, 3, 1, 8, 2, 7, 10, 6, 6), 
                j = c(8, 8, 8, 4, 3, 9, 1, 4,  8, 9) , 
                v = c(1.9, 18, 1.3, 17, 1.5, 14, 11, 1.4, 18, 2.0), 
                o = c(3, 3, 3, 3, 1, 2, 1, 2, 3, 3))

a[which.min(a$v), c('i', 'j')] # find lowest v value and get i,j value
a <- a[-which.min(a$v)] # remove row from index
a <- cbind(a, data.frame(i = 3, j = 9, v = 2, o = 2)) # add a row

当我使用 Rcpp 时,Rcpp::DataFrame 可能是一个选项(我不知道我会怎么做 which.min 它),但我猜它对于任务来说很慢,因为这些操作需要重复很多,我不需要将它运回 R。

编辑:

目标。这里要明确的是,目标是提高速度。这是将代码从 R 翻译成 C++ 的明显原因(可能还有其他原因,这就是我澄清的原因)。然而,维护和易于实现是其次的。

操作更精确。算法是:将大量数据添加到数组(多行),然后提取最低值并将其删除。重复。 这就是为什么我不会选择排序 vector ,而是在数组频繁更新(添加)时始终按需搜索最低数据。我认为它更快,但也许我错了。

最佳答案

我认为一个 vector 的 vector 应该做你想做的。您需要手动实现最小值查找(两个嵌套循环),这是您在不增加开销的情况下可以做到的最快速度。 您可以通过跟踪每行中最小元素的位置以及该行来加快查找最小值的速度。

关于c++ - R 数据框和 c++ 中的 which.min() 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673611/

相关文章:

c++ - 将 dnorm 与 RcppArmadillo 结合使用

c++ - Rcpp 中值和引用参数之间的区别

c# - Windows Kinect SDK + OpenNI Primesense

R:在堆栈栏上显示字符或类别

r - if else 语句和 if_else 的不同行为

r - 将 R 中的两个列表组合成一个数据框

c++ - 将大矩阵/数组转换为 Armadillo 矩阵

python - 提升.Python : how to get super() methods called?

c++ - 序列化 C++ 对象

c++ - 成员函数如何理解对象是通过取消引用 const 指针获得的?