- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对包含数字向量的列执行操作,我想知道执行此操作的最佳方法是什么。
到目前为止,我已经尝试了以下方法,set 方法似乎是最好的,但也许我错过了一些更好的方法来解决这个问题?在 C++ 中执行此操作可以预期有多大的速度提升?
testVector <- data.table::data.table(A = lapply(1:10^5, function(x) runif(100)))
microbenchmark::microbenchmark(lapply = testVector[, B := lapply(A, diff)],
map = testVector[, C := Map(diff, A)],
set = set(testVector, NULL, "D", lapply(testVector[["A"]], diff)),
forset = {for(i in seq(nrow(testVector))) set(testVector, i, "E", list(list(diff(testVector[[i, "A"]]))))},
times = 10L)
结果如下:
Unit: milliseconds
expr min lq mean median uq max neval
set 789.7967 924.8178 1031.923 1082.325 1146.306 1174.671 10
lapply 1122.2454 1468.9556 1563.002 1619.668 1692.217 1919.405 10
map 1297.5236 1320.7022 1571.344 1592.176 1695.673 2012.051 10
forset 1887.0003 2023.7357 2139.202 2174.912 2245.943 2396.844 10
我已经检查了 Rcpp 如何完成任务。虽然我的 C++ 技能很差,但速度提高了 >10 倍。
C++代码:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List cppDiff(List column){
int cSize = column.size();
List outputColumn(cSize, NumericVector());
for(int i = 0; i < cSize; ++i){
NumericVector vectorElement = column[i];
outputColumn[i] = Rcpp::diff(vectorElement);
}
return(outputColumn);
}
测试代码:
library(Rcpp);library(data.table);library(microbenchmark)
sourceCpp("diffColumn.cpp")
vLen <- 100L
cNum <- 1e4L
test <- data.table(A = lapply(1L:cNum, function(x) runif(vLen)))
throughMatrix <- function(column){
difmat <- diff(matrix(unlist(column), nrow = vLen, ncol = cNum))
lapply(seq(cNum), function(i) difmat[, i])
}
microbenchmark::microbenchmark(DT = set(test, NULL, "B", lapply(test[["A"]], diff)),
mat = set(test, NULL, "C", throughMatrix(test[["A"]])),
cpp = set(test, NULL, "D", cppDiff(test[["A"]])),
times = 5)
> all.equal(test$B, test$C)
[1] TRUE
> all.equal(test$B, test$D)
[1] TRUE
Unit: milliseconds
expr min lq mean median uq max neval
DT 845.04418 912.60961 1024.79183 1011.59417 1107.14306 1323.9963 10
mat 643.02187 663.92700 778.91145 816.95972 844.37206 864.1173 10
cpp 45.28504 49.35746 84.27799 78.32085 84.87942 226.1347 10
还有 10000 x 10000 列的另一个基准:
Unit: milliseconds
expr min lq mean median uq max neval
DT 7851.4352 8504.3501 21632.018 25246.7860 29133.358 37424.163 5
mat 8679.9386 8724.1497 22852.724 18235.7693 39199.966 39423.794 5
cpp 244.8572 247.7443 1439.011 303.2556 2715.643 3683.552 5
最佳答案
您是否考虑过使用矩阵?语法和数据结构差异很大,下面的代码不是直接替换,但根据此操作前后的分析管道,我怀疑矩阵输入/输出可能比列表更适合处理数据-无论如何都是列。
library(data.table)
VectorLength <- 1e5L
testVector <- data.table::data.table(A = lapply(1:VectorLength, function(x) runif(100)))
A <- matrix(data = runif(100L*VectorLength),nrow = 100L,ncol = VectorLength)
microbenchmark::microbenchmark(set = testVector[, B := lapply(A, diff)],
Matrix = B <- diff(A),
times = 10L)
在 Windows PC 上产生以下结果:
Unit: milliseconds
expr min lq mean median uq max neval
set 1143.933 1251.064 1316.944 1331.4672 1376.8016 1431.8988 10
Matrix 307.945 315.689 363.255 335.4382 390.1124 499.5492 10
以及运行 Ubuntu 14.04 的 Linux 服务器上的以下内容
Unit: milliseconds
expr min lq mean median uq max neval
set 1342.6969 1410.3132 1519.6830 1551.2051 1594.3431 1699.7480 10
Matrix 285.0472 297.3283 375.0613 302.4198 488.3482 503.0959 10
作为引用,当强制转换为 data.table 时这里的输出是什么样子的:
str(as.data.table(t(B)))
返回
Classes ‘data.table’ and 'data.frame': 99 obs. of 100000 variables:
$ V1 : num 0.23 0.24 -0.731 0.724 0.074 ...
$ V2 : num -0.628 0.585 -0.164 0.269 -0.16 ...
$ V3 : num 0.1735 0.1128 -0.3069 0.0341 -0.2664 ...
$ V4 : num -0.392 0.593 -0.345 -0.327 0.747 ...
$ V5 : num 0.1084 0.2915 0.3858 -0.1574 -0.0929 ...
$ V6 : num -0.2053 -0.2669 -0.2 0.0214 0.1111 ...
$ V7 : num 0.0582 -0.2141 0.7282 -0.6877 0.4981 ...
$ V8 : num -0.439 -0.114 0.275 0.4 -0.184 ...
$ V9 : num 0.13673 0.55244 -0.43132 0.21692 -0.00308 ...
$ V10 : num 0.701 -0.0486 -0.1464 -0.5595 -0.046 ...
$ V11 : num 0.3583 -0.2588 -0.0742 -0.2113 0.9434 ...
$ V12 : num -0.1146 0.5346 -0.0594 -0.6534 0.6112 ...
$ V13 : num 0.473 0.307 -0.544 0.718 -0.315 ...
所以我很好奇性能改进在更大范围内如何看待,结果证明这是一个有点有趣的问题,其中最有效的方法高度依赖于数据的大小/形状。
使用以下格式:
VectorLength <- 1e5L
ItemLength <- 1e2L
testVector <- data.table::data.table(A = lapply(1:VectorLength, function(x) runif(ItemLength)))
A <- matrix(data = runif(ItemLength*VectorLength),nrow = ItemLength,ncol = VectorLength)
microbenchmark::microbenchmark(set = set(testVector, NULL, "D", lapply(testVector[["A"]], diff)),
Matrix = B <- diff(A),
times = 5L)
我遍历了一系列 VectorLength
和 ItemLengths
值。从这里开始称为 (Vector x Item),其中 (10,000 x 100) 表示具有 100 个元素的 10,000 个向量(data.table 行)。由于矩阵形式被转置以适应基本 R diff 函数,因此这将转换为具有 100 行和 10,000 列的矩阵。
Unit: milliseconds
expr min lq mean median uq max neval
set 83.947769 88.420871 102.822626 90.91088 104.737002 146.096606 5
Matrix 2.368524 2.437371 2.661553 2.45122 2.476745 3.573904 5
Unit: milliseconds
expr min lq mean median uq max neval
set 119.33550 140.35294 174.17641 198.14286 199.56239 213.48837 5
Matrix 20.75578 23.00535 60.10874 79.47677 88.33331 88.97251 5
Unit: milliseconds
expr min lq mean median uq max neval
set 337.0859 382.6305 407.9396 429.0512 440.6331 450.2971 5
Matrix 300.3360 316.5533 411.4678 352.0477 534.4063 553.9957 5
Unit: milliseconds
expr min lq mean median uq max neval
set 1428.319 1483.324 1518.096 1508.114 1578.929 1591.792 5
Matrix 3059.825 3119.654 4366.107 3224.755 6164.489 6261.815 5
根据您实际使用的数据的维度,方法的相对性能将发生巨大变化。
如果您的实际数据与您最初提出的用于基准测试目的的数据相似,那么矩阵运算应该运行良好,但如果尺寸以某种方式变化,我会使用具有代表性的“形状”数据重新进行基准测试。
希望这对你有帮助,因为它对我来说很有趣。
关于r - 如何有效地对 data.table 中的向量列进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48024769/
我收到未知数据,我想以编程方式查看相关性,并将所有完全相关的变量组合在一起(忽略方向)。在下面的数据集中,我可以手动查看相关性并说 a, f, g, h一起去吧b, d, e .我怎样才能以编程方
这个问题在这里已经有了答案: use dplyr's summarise_each to return one row per function? (3 个答案) 关闭 4 年前。 作为探索性工作的
我想要完成的是使用数组存储未知大小的多项式。我在互联网上看到的是使用一个数组,每个单元格都包含系数,度数是单元格编号,但这不是有效的,因为如果我们有一个多项式,如:6x^14+x+5。这意味着我们将从
嘿伙计们,我一直在尝试解析 HTML 文件以从中抓取文本,但时不时地,我会得到一些非常奇怪的字符,例如 à€œ。我确定是“智能引号”或弯头标点符号导致了我的所有问题,因此我的临时修复是搜索所有这些字符
我原来的 data.table 由三列组成。 site、observation_number 和 id。 例如以下是 id = z 的所有观察结果 |site|observation_number|i
"Premature optimisation is the root of all evil (but it's nice to have once you have an ugly solutio
给定这个数组 X: [1 2 3 2 3 1 4 5 7 1] 和行长度数组R: [3 2 5] 表示转换后每行的长度。 我正在寻找一个计算效率高的函数来将 X reshape 为数组 Y: [[ 1
我有一些 data.frame s: # Sample data a <- data.frame(c(1:10), c(11:20)) names(a) <- c("A", "B") b <- dat
我有点困惑。列表擅长任意位置插入,但不善于随机访问? (怎么可能)如果你不能随机访问,你怎么知道在哪里插入? 同样,如果你可以在任何位置插入,为什么你不能从那个位置高效地读取? 最佳答案 如果您已经有
我有一个向量,我想计算它的移动平均值(使用宽度为 5 的窗口)。 例如,如果有问题的向量是[1,2,3,4,5,6,7,8],那么 结果向量的第一个条目应该是 [1,2,3,4,5] 中所有条目的总和
有一个随机整数生成器,它生成随机整数并在后台运行。需求设计一个API,调用时返回当时的簇数。 簇:簇是连续整数的字典顺序。例如,在这种情况下,10,7,1,2,8,5,9 簇是 3 (1,2--5--
我想做的是将一组 (n) 项分成大小相等的组(大小为 m 的组,并且为简单起见,假设没有剩余,即 n 可以被 m 整除)。这样做多次,我想确保同一组中的任何项目都不会出现两次。 为了使这稍微更具体一些
假设我有一些包含类型排列的模板表达式,在本例中它们来自 Abstract Syntax Tree : template
我已经在这方面工作了几天,似乎没有我需要的答案。 由于担心这个被标记为重复,我将解释为什么其他问题对我不起作用。 使用 DIFFLIB for Python 的任何答案都无助于我的需求。 (我在下面描
我正在使用 NumPy 数组。 我有一个 2N 长度向量 D,并希望将其一部分 reshape 为 N x N 数组 C. 现在这段代码可以满足我的要求,但对于较大的 N 来说是一个瓶颈: ``` i
我有一个问题: 让我们考虑这样的 pandas 数据框: Width Height Bitmap 67 56 59 71 61 73 ...
我目前正在用 C 语言编写一个解析器,设计它时我需要的东西之一是一个可变字符串“类”(一组对表示实例的不透明结构进行操作的函数),我将其称为 my_string。 string 类的实例只不过是包装
假设我在 --pandas-- 数据框中有以下列: x 1 589 2 354 3 692 4 474 5 739 6 731 7 259 8 723
我有一个成员函数,它接受另一个对象的常量引用参数。我想 const_cast 这个参数以便在成员函数中轻松使用它。为此,以下哪个代码更好?: void AClass::AMember(const BC
我们目前正在将 Guava 用于其不可变集合,但我惊讶地发现他们的 map 没有方法可以轻松创建只需稍作修改的新 map 。最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一
我是一名优秀的程序员,十分优秀!