相关疑难解决方法(0)

如何将相同的函数应用于data.table中的每个指定列

我有一个data.table,我希望在某些列上执行相同的操作.这些列的名称以字符向量给出.在这个特定的例子中,我想将所有这些列乘以-1.

一些玩具数据和指定相关列的向量:

library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")
Run Code Online (Sandbox Code Playgroud)

现在我这样做,循环遍历字符向量:

for (col in 1:length(cols)) {
   dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有for循环的情况下直接执行此操作?

r data.table

70
推荐指数
3
解决办法
4万
查看次数

如何按组加速子集

我曾经用dplyr实现我的数据争论,但有些计算是"慢"的.特别是按组子集,我读到dplyr很慢,当有很多组并且基于这个基准数据时.表可能更快,所以我开始学习data.table.

以下是如何使用250k行和大约230k组重现与我的实际数据接近的内容.我想按id1,id2进行分组,并将max(datetime)每个组的行子集化.

DATAS

# random datetime generation function by Dirk Eddelbuettel
# https://stackoverflow.com/questions/14720983/efficiently-generate-a-random-sample-of-times-and-dates-between-two-dates
rand.datetime <- function(N, st = "2012/01/01", et = "2015/08/05") {
  st <- as.POSIXct(as.Date(st))
  et <- as.POSIXct(as.Date(et))
  dt <- as.numeric(difftime(et,st,unit="sec"))
  ev <- sort(runif(N, 0, dt))
  rt <- st + ev
}

set.seed(42)
# Creating 230000 ids couples
ids <- data.frame(id1 = stringi::stri_rand_strings(23e4, 9, pattern = "[0-9]"), 
                  id2 = stringi::stri_rand_strings(23e4, 9, pattern = "[0-9]"))
# Repeating randomly the ids[1:2000, ] to create groups
ids <- …
Run Code Online (Sandbox Code Playgroud)

performance r dplyr data.table

20
推荐指数
2
解决办法
1431
查看次数

如何将函数应用于data.table的子集,使用by并将所有列公开给函数?

data.table按组切片时,用于切片数据的变量在函数执行期间不在子集中.我用这个证明了这个debugonce.

library(data.table)
x <- data.table(a = rep(letters[1:4], each = 3), b = rep(c("a", "b"), each = 6), c = rnorm(12))

myfun <- function(y) paste(y$a, y$b, y$c, collapse = "")

> debugonce(myfun)
> x[, myfun(.SD), by = .(b, a)]
debugging in: myfun(.SD)
debug: paste(y$a, y$b, y$c, collapse = "")
Browse[2]> y
            c
1: -1.2662416
2:  0.9818497
3: -0.5395385
Run Code Online (Sandbox Code Playgroud)

我所追求的是split-sapply范例的功能,我将根据factor(s)切片data.frame并将该函数应用于所有列,也就是说,还包括用于切片的变量它(如下所示).

> debugonce(myfun)

> sapply(split(x, f = list(x$b, x$a)), FUN = myfun)
debugging in: FUN(X[[i]], ...)
debug: paste(y$a, y$b, …
Run Code Online (Sandbox Code Playgroud)

r data.table

7
推荐指数
1
解决办法
4075
查看次数

使用dplyr将一列预测值添加到数据框

我有一个带有一列模型的数据框,并且正在尝试向其添加一列预测值。一个最小的例子是:

exampleTable <- data.frame(x = c(1:5, 1:5),
                           y = c((1:5) + rnorm(5), 2*(5:1)),
                           groups = rep(LETTERS[1:2], each = 5))

models <- exampleTable %>% group_by(groups) %>% do(model = lm(y ~ x, data = .))
exampleTable <- left_join(tbl_df(exampleTable), models)

estimates <- exampleTable %>% rowwise() %>% do(Est = predict(.$model, newdata = .["x"]))
Run Code Online (Sandbox Code Playgroud)

如何将一列数值预测添加到exampleTable?我尝试使用mutate直接将列添加到表中而没有成功。

> exampleTable <- exampleTable %>% rowwise() %>% mutate(data.frame(Pred = predict(.$model, newdata = .["x"])))
Error: no applicable method for 'predict' applied to an object of class "list" …
Run Code Online (Sandbox Code Playgroud)

r dplyr

5
推荐指数
2
解决办法
5346
查看次数

使用 purrr:::map 的等效项来迭代 data.table

我想迭代一遍data.table,就像purrr::map那样。虽然我能够data.table通过转换data.framedata.tableinside来应用函数purrr::map,但我想知道是否data.table有内置的东西可以放弃使用purrr::map. 我问这个问题是因为我不确定purrr::map在速度和所需内存方面的性能。与处理大型数据集时dplyr相比,我对它的速度和内存利用率感到失望。data.table

我研究了 stackoverflow,发现迭代数据表线程上接受的答案已经使用了for循环。for出于性能原因,我不太喜欢循环。

这是示例数据文件:

dput(Input_File)
structure(list(Zone = c("East", "East", "East", "East", "East", 
"East", "East", "West", "West", "West", "West", "West", "West", 
"West"), Fiscal.Year = c(2016, 2016, 2016, 2016, 2016, 2016, 
2017, 2016, 2016, 2016, 2017, 2017, 2018, 2018), Transaction.ID = c(132, 
133, 134, 135, 136, 137, 171, 171, 172, 173, 175, 176, 177, …
Run Code Online (Sandbox Code Playgroud)

r dplyr data.table purrr

5
推荐指数
1
解决办法
3685
查看次数

标签 统计

r ×5

data.table ×4

dplyr ×3

performance ×1

purrr ×1