【问题标题】:Add results of a function to a new row in a data table将函数的结果添加到数据表中的新行
【发布时间】:2015-10-25 04:23:57
【问题描述】:

我有一个列表doms.uni,其中包含 4 个唯一域名。我要做的是遍历列表并将每个域传递给一个函数 - dom.security() - 执行 API 调用。

结果被输入一个 data.table 对象 - dt.dom - 每个域行有 10 列。

for (i in 1:nrow(doms.uni)){
  dt.dom <- as.data.table(dom.security(doms.uni[i]))
}

问题在于该函数只是“插入”最后一行结果。我在这里完全不知所措。

当前输出:

> dt.dom
       dga_score perplexity  entropy securerank2 asn_score prefix_score rip_score fastflux     attack threat_type
    1:         0  0.5734945 2.235926    -6.36658 -1.861628    -1.847827 -2.262666    FALSE CryptoWall  Ransomware

我的期望:

> dt.dom
   dga_score perplexity  entropy securerank2 asn_score prefix_score rip_score fastflux     attack threat_type
1:         0  0.5734945 2.235926    -6.36658 -1.861628    -1.847827 -5.262666    FALSE CryptoWall  Ransomware
2:         0  0.5734945 2.235926    -6.36658 -1.861628    -1.847827 -10.262666    FALSE CryptCrypt  Ransomware
3:         0  0.5734945 2.235926    -6.36658 -1.861628    -1.847827 -22.262666    FALSE BSCrypt  Ransomware
4:         0  0.5734945 2.235926    -6.36658 -1.861628    -1.847827 -33.262666    FALSE TeslaCrypt  Ransomware

【问题讨论】:

  • 不要乞求或任何事情,但随时 +1 答案。 ;-)
  • @MrMeritology Andrew 还不能投票。他至少需要一个reputation score of 15 for that。但是为什么你当时不赞成他的问题呢?这样一来,您就可以帮助他更快地达到这一点。
  • 请提供一个完全可重现的示例(doms.uni 是什么)和确切所需的输出。运行for 循环1:nrow(doms.uni) 是一种非常糟糕的做法。这样做的同时生长物体会更糟。在每个循环中执行as.data.table 更糟糕。您没有使用 data.table 包功能,而是相反。
  • doms.uni 是一个包含 4 个字符串(域)的列表

标签: r data.table


【解决方案1】:
library(data.table)
library(microbenchmark)

doms <- rep(LETTERS, 10)

process_dom <- function(dom) {

  list(dname=dom,
       lname=tolower(dom),
       val=as.integer(charToRaw(dom)),
       vow=dom %in% c("A", "E", "I", "O", "U", "Y"))

}

# method 1 - bind big list

bd1 <- function() { rbindlist(lapply(doms, process_dom)) }

# method 2 - preallocate & set
# important to keep the modes/types the same
big_doms2 <- data.table(dname=rep(as.character(NA), length(doms)),
                        lname=rep(as.character(NA), length(doms)),
                        val=rep(as.integer(NA), length(doms)),
                        vow=rep(as.logical(NA), length(doms)))

bd2 <- function() {
  for (i in 1:length(doms)) {
    d <- process_dom(doms[i])
    big_doms2[i, (c("dname", "lname", "val", "vow")) := d]
  }
}

mb <- microbenchmark(bd1(), bd2())

mb

## Unit: milliseconds
##   expr       min        lq      mean    median        uq        max neval cld
##  bd1()  1.160419  1.344958  1.497937  1.440926  1.531688   3.879397   100  a 
##  bd2() 88.689616 93.445185 97.679849 96.609646 99.077425 126.626109   100   b

【讨论】:

  • 谢谢鲍勃,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多