- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道在循环中附加到向量或列表的最节省内存的方法是 preallocate那个向量/列表,在分配给它的索引之前。
在循环中将 data.frames 绑定(bind)到另一个的内存(和时间)效率最高的方法是什么? (注意:最终,我追求的是在一个循环中绑定(bind)大量大型数据帧的最有效、最明智的方法)
我们可以使用标准的rbind
,例如:
output <- data.frame(a=c(), b=c())
for(i in 1:1000) {
temp <- data.frame(a=c(i), b=c(i))
output <- rbind(output, temp)
}
或者 bind_rows()
:(should be faster)
library(dplyr)
output <- data.frame(a=c(), b=c())
for(i in 1:1000) {
temp <- data.frame(a=c(i), b=c(i))
output <- bind_rows(output, temp)
}
我不确定其中之一是否效率更高(例如对于长期/大型操作),也不确定是否有其他更有效的替代方案/最佳实践?
最佳答案
正如 OP 在评论中所建议的那样,最好的办法是制作一个大列表,然后在最后绑定(bind)所有内容。这使用 lapply()
而不是后跟 do.call(rbind, tmp)
的显式循环:
n = 1000
tmp = lapply(seq_len(n), function(i) data.frame(a = i, b = i))
output = do.call(rbind, tmp)
## or
output = dplyr::bind_rows(tmp)
## or
output = data.table::rbindlist(tmp)
现在,如果我们在需要循环的同时针对这个特定示例,我们还可以使用几个替代方案。例如,我们知道每次迭代都会产生一个整数,而不是增加数据帧列表。因此,我们可以简单地预先分配整数向量,这也很容易转换为 rcpp。 :
n = 1000L
a = b = integer(n)
for (i in seq_len(n)) {
a[i] = b[i] = i
}
data.frame(a = a, b = b)
## or with Rcpp:
rcpp_new_loop = Rcpp::cppFunction(code =
'DataFrame rcpp_new_loop(int n) {
IntegerVector a(n);
IntegerVector b(n);
for (int i = 0; i < n; i++) {
a(i) = b(i) = i + 1;
}
return(DataFrame::create(Named("a") = a, _["b"] = b));
}
')
同样,data.frame
调用也有很多开销。 dplyr::bind_rows()
和 data.table::rbindlist()
默认为 data.frame
lists< 的结果类型
:
tmp = lapply(seq_len(n), function(i) list(a = i, b = i))
##data.table
output = rbindlist(tmp)
setDF(output)
##dplyr
output = bind_rows(tmp)
as.data.frame(output)
性能:不出所料,Rcpp 是最快的方法。但是将 data.table::rbindlist
或 dplyr::bind_rows
与列表一起使用是一种非常简单的方法。
### n = 1,000
# A tibble: 9 x 13
expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
<bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
1 OP 378.18ms 379.92ms 2.63 15.7MB 2.63 2 2 760ms
2 do_call 254.76ms 254.89ms 3.92 220.7KB 5.88 2 3 510ms
3 bind_rows_df 196.69ms 202.48ms 4.94 16.9KB 3.29 3 2 607ms
4 dt_df 179.41ms 184.76ms 4.52 32.8KB 3.01 3 2 664ms
5 bind_rows_list 2.74ms 2.81ms 321. 16.9KB 3.98 161 2 502ms
6 new_loop 2.56ms 2.63ms 342. 17.6KB 4.00 171 2 500ms
7 dt_list 1.33ms 1.35ms 525. 32.8KB 3.99 263 2 501ms
8 new_loop_fx(n) 270.2us 280.5us 2188. 11.8KB 4.00 1094 2 500ms
9 rcpp_new_loop(n) 217.4us 228.3us 3872. 10.4KB 4.00 1936 2 500ms
### n = 10,000
# A tibble: 9 x 13
expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
<bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
1 OP 5.69s 5.69s 0.176 1.51GB 5.80 1 33 5.69s
2 do_call 2.67s 2.67s 0.374 2.2MB 3.74 1 10 2.67s
3 bind_rows_df 1.92s 1.92s 0.520 157.52KB 4.16 1 8 1.92s
4 dt_df 2.25s 2.25s 0.444 243.77KB 4.44 1 10 2.25s
5 bind_rows_list 30.73ms 34.57ms 28.5 157.75KB 3.81 15 2 525.49ms
6 new_loop 3.64ms 3.79ms 238. 123.07KB 3.99 119 2 500.85ms
7 dt_list 14.68ms 17.98ms 49.8 243.77KB 5.98 25 3 502ms
8 new_loop_fx(n) 1.2ms 1.24ms 691. 117.28KB 7.99 346 4 500.55ms
9 rcpp_new_loop(n) 299.5us 313.3us 2818. 80.66KB 4.00 1409 2 499.96ms
##code to reproduce::
library(data.table)
library(dplyr)
n = 1000L
new_loop_fx = function(n){
a = b = integer(n)
for (i in seq_len(n)) {
a[i] = b[i] = i
}
data.frame(a = a, b = b)
}
rcpp_new_loop = Rcpp::cppFunction(code =
'DataFrame rcpp_new_loop(int n) {
IntegerVector a(n);
IntegerVector b(n);
for (int i = 0; i < n; i++) {
a(i) = b(i) = i + 1;
}
return(DataFrame::create(Named("a") = a, _["b"] = b));
}
')
bench::mark(
OP = {
output <- data.frame(a=c(), b=c())
for(i in seq_len(n)) {
temp <- data.frame(a=i, b=i)
output <- rbind(output, temp)
}
output
}
,
do_call = {
tmp = lapply(seq_len(n), function(i) data.frame(a = i, b = i))
output = do.call(rbind, tmp)
}
,
bind_rows_df = {
tmp = lapply(seq_len(n), function(i) data.frame(a = i, b = i))
output = bind_rows(tmp)
as.data.frame(output)
}
,
dt_df = {
tmp = lapply(seq_len(n), function(i) data.frame(a = i, b = i))
output = rbindlist(tmp)
setDF(output)
}
,
bind_rows_list = {
tmp = lapply(seq_len(n), function(i) list(a = i, b = i))
output = bind_rows(tmp)
as.data.frame(output)
}
,
new_loop = {
a = b = integer(n)
for (i in seq_len(n)){
a[i] = b[i] = i
}
data.frame(a = a, b = b)
}
,
dt_list = {
tmp = lapply(seq_len(n), function(i) list(a = i, b = i))
output = rbindlist(tmp)
setDF(output)
}
,
new_loop_fx(n),
rcpp_new_loop(n)
)
关于r - 在循环中将 data.frame 行绑定(bind)到另一个 data.frame 的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60865434/
只是想知道这些结构之间有什么区别(text、data、rodata、bss 等)在链接描述文件中: .data : { *(.data) } .data : { *(.data*) }
Data 定义为其核心功能之一 gfoldl : gfoldl :: (Data a) => (forall d b. Data d => c (d -> b) -> d -> c b)
以下之间有什么区别:data-sly-use、data-sly-resource、data-sly-include 和 数据-sly-模板?我正在阅读 Sightly AEM 上的文档,我非常困惑。
我有一个 Spring Boot、Spring Data JPA (hibernate) Web 应用程序,并且想引入文本搜索功能。 我理解以下内容 hibernate search 或 spring
我不知道我的代码有什么问题。我读了其他有同样问题的人的一些问题,但没有找到答案。当我尝试编译时出现以下错误: ||In function 'main':| |35|error: expected ex
我不太确定为什么会收到此错误或其含义。我的数据框称为“数据”。 library(dplyr) data %>% filter(Info==1, Male==1) %>% lm(CFL_
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
我正在通过 this project 在 Android 上摆弄 node.js ,我需要一种方法将 js 文件部署到私有(private)目录(以隐藏源代码,防止用户篡改),该目录也物理存在于文件系
大家好我有点沮丧,所以我希望得到一些帮助。我的项目在 SwiftUI 中。我想使用图像选择器将图像保存到 Core Data。我实现了让 ImagePicker 工作,但我正在努力转换 Image -
我有以下数据和代码: mydf grp categ condition value 1 A X P 2 2 B X P 5
我一直在努力解决这个问题,但我根本找不到任何解决问题的方法。希望这里有人可以提供帮助。 我正在尝试为具有以下结构的某些数据创建个人选择矩阵: # A tibble: 2,152 x 32 a
我了解 Data.Map.Lazy 和 Data.Map.Strict 是不同的。但是,当您导入 Data.Map 时,您究竟导入了什么:严格的、惰性的还是两者的组合? 最佳答案 懒人。看着docs
我正在开发一个 C 程序,用于从 BerkeleyDB DBTree 数据库中提取数据值与特定模式匹配的记录。我创建数据库,打开它,将键的 DBT 和数据的另一个 DBT 清零,将 DBT 标志设置为
所以我有以下成员(member)历史表 User_ID | Start date | End Date | Type(0-7) | ---------------------------
随着最近推出的包dataframe ,我认为是时候正确地对各种数据结构进行基准测试,并突出每种数据结构的优势。我不是每个人的不同优势的专家,所以我的问题是,我们应该如何对它们进行基准测试。 我尝试过的
我有来自 API 的数据,但无法将数组中的数据设置为 vue.js 中的 this.data这是来自 API 的数据(JSON) 你能告诉我这个语法吗 {"id":1613, "name_org":"
在 Vue.js到目前为止,我已经找到了两种定义数据的方法:data: {} 和 data() { return; }. data: { defaultLayout: 'default' }
我正在研究Spring Data Rest Services,并在自定义拦截器中遇到一些问题。之前我使用spring-data-rest-webmvc 2.2.0并以以下方式添加了拦截器。 publi
我是一名优秀的程序员,十分优秀!