【发布时间】:2019-02-23 03:07:30
【问题描述】:
我是data.table 的新手,想试试看它是否能让我的分析更快。我主要使用knitr 编译.rnw 文件(我倾向于每小时编译多次,所以我希望它尽可能快)。
我在下面发布了一个示例,这绝不是与data.table 和data.frame 进行比较的问题。我想知道我下面的代码是否应该是这样的。
我基本上加入了两个data.tables,然后需要使用na.approx 缺少NA 值进行线性近似。我使用了 CRAN 的 Introduction to data.table vignette 和 R-Pubs 的 JOINing data in R using data.table。
我在下面使用的代码导致我对 data.table 方法的最佳尝试需要很长时间(通常也是如此,我只添加了其他代码参考)。
另外,如果有人知道是否有办法将na.approx() 输入到一个链中,并且仍然将输出作为data.frame,那将不胜感激。请注意df_merged = as.data.frame(df_merged) 行,如果可能,我想删除它!
非常感谢您的任何意见谢谢!
library(data.table)
library(zoo)
library(dplyr)
dt_function_test = function() {
set.seed(123)
# data.table
dt_random = data.table(vals = runif(1E5, 0, 500))
dt_na = data.table(vals = c(0, 250, 500),
ref1 = c(0.33, 0.45, 0.78),
ref2 = c(0.12, 0.79, 1))
dt_merged = merge(dt_random[],
dt_na[],
all = TRUE)
dt_merged = dt_merged[, lapply(.SD,
na.approx),
by = vals]
}
df_function_test = function() {
set.seed(123)
# data.frame
df_random = data.frame(vals = runif(1E5, 0, 500))
df_na = data.frame(vals = c(0, 250, 500),
ref1 = c(0.33, 0.45, 0.78),
ref2 = c(0.12, 0.79, 1))
df_merged = full_join(df_random,
df_na) %>%
na.approx
df_merged = as.data.frame(df_merged)
}
print(system.time(dt_function_test()))
# user system elapsed
# 11.42 0.00 11.46
print(system.time(df_function_test()))
# Joining, by = "vals"
# user system elapsed
# 0.05 0.05 0.10
【问题讨论】:
-
如果我没记错的话,他们正在计算差异。
dplyr代码(如果我错了,请有人纠正我)在每一列上执行 na.approx。data.table代码在每一行上执行 na.approx (因为 vals 在每一行上几乎总是差异)。只需打印每个输出的几行以检查它们是否相同。 -
您将
by = vals分组在data.table代码中,但不在data.frame代码中? -
@chinsoon12 好点。结果实际上并不相同,但我打算这样做!所以我的理解是有缺陷的......我会修改,并审查我现在看到的你的答案......
-
@MichaelChirico
data.frame代码自动按列vals分组,因为它在两者中都很常见,所以我没有明确指定要加入哪一列。 -
这不是
by的意思吗?by在vals的每个值中表示applyna.approx`... 指定合并列应该发生在merge步骤中?
标签: r dplyr data.table na.approx