使用data.table包实现滑动窗口函数的最佳(最快)方法是什么?
我正在尝试计算滚动中位数但每个日期有多行(由于2个额外的因素),我认为这意味着动物园rollapply函数不起作用.以下是使用naive for循环的示例:
library(data.table)
df <- data.frame(
id=30000,
date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000),
factor1=rep(1:5, each=200),
factor2=1:5,
value=rnorm(30, 100, 10)
)
dt = data.table(df)
setkeyv(dt, c("date", "factor1", "factor2"))
get_window <- function(date, factor1, factor2) {
criteria <- data.table(
date=as.IDate((date - 7):(date - 1), origin="1970-01-01"),
factor1=as.integer(factor1),
factor2=as.integer(factor2)
)
return(dt[criteria][, value])
}
output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)]
for(i in nrow(output):1) {
print(i)
output[i, window_median:=median(get_window(date, factor1, factor2))]
}
Run Code Online (Sandbox Code Playgroud) 使用data.table时可以返回除一个之外的所有列,例如data.frame?
如果答案是否定的,是否有人有一种优雅的方式将多个时间序列转换data.table为一个zoo或其他时间序列对象?
请考虑以下示例:
library(data.table)
library(zoo)
## DEFINE DATA
set.seed(1)
dt = data.table(
mydates = as.Date("2012-01-01") + 1:9,
value1 = sort(rpois(9, 6)),
value2 = sort(rpois(9, 6)),
value3 = sort(rpois(9, 6)),
value4 = sort(rpois(9, 6)),
value5 = sort(rpois(9, 6)))
## CONVERT TO DATA FRAME
df = as.data.frame(dt)
## CONVERT TO ZOO
zooObj = zoo(df[,-1], df$mydates)
## EXAMPLE OF DESIRED RESULTS
plot(zooObj, col=1:ncol(zooObj))
Run Code Online (Sandbox Code Playgroud)
没有我怎么办df = as.data.frame(dt)?
data.table有一个很好的功能,可以抑制输出到表的头部和尾部.
是否可以一次查看/打印超过100行?
library(data.table)
## Convert the ubiquitous "iris" data to a data.table
dtIris = as.data.table(iris)
## Printing 100 rows is possible
dtIris[1:100, ]
## Printing 101 rows is truncated
dtIris[1:101, ]
Run Code Online (Sandbox Code Playgroud)
我经常有data.table结果,有点大(例如200行),我只想查看.
我正在寻找一种通过data.table进行简单聚合/计数的方法.
考虑虹膜数据,每个物种有50个观测值.为了计算每个物种的观察结果,我必须总结除物种以外的一列,例如"Sepal.Length".
library(data.table)
dt = as.data.table(iris)
dt[,length(Sepal.Length), Species]
Run Code Online (Sandbox Code Playgroud)
我发现这令人困惑,因为看起来我正在Sepal.Length上做一些事情,乍一看,真的只有物种才重要.
这是我想说的,但我没有得到有效的输出:
dt[,length(Species), Species]
Run Code Online (Sandbox Code Playgroud)
> dt[,length(Sepal.Length), Species]
Species V1
1: setosa 50
2: versicolor 50
3: virginica 50
Run Code Online (Sandbox Code Playgroud)
> dt[,length(Species), Species]
Species V1
1: setosa 1
2: versicolor 1
3: virginica 1
Run Code Online (Sandbox Code Playgroud)
我无法在R studio中编译最基本的PDF文件.
这是我的错误消息:
output file: Report.knit.md
! LaTeX Error: File `lmodern.sty' not found.
Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)
Enter file name:
! Emergency stop.
<read *>
l.3 \usepackage
pandoc: Error producing PDF from TeX source
Error: pandoc document conversion failed with error 43
Execution halted
Run Code Online (Sandbox Code Playgroud)

# > sessionInfo()
# R version 3.1.2 (2014-10-31)
# Platform: x86_64-unknown-linux-gnu (64-bit)
#
# locale:
# [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
# [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
# [5] …Run Code Online (Sandbox Code Playgroud) 如何在Excel中快速打开小型R表/矢量对象?
例如,假设您要在Excel中查看以下三个对象:
## A data frame with commas and quotes
df = data.frame(
area = unname(state.x77[,'Area']),
frost = unname(state.x77[,'Frost']),
comments = "Ok for a visit, but don't want to live there",
challengeComments = c('"', '""'))
row.names(df) = state.name
df = df[1:10, ]
df['California', 'comments'] = "Would like to live here"
## A Matrix
mat = matrix(rnorm(100), 10)
## A Vector
v = 1:10
Run Code Online (Sandbox Code Playgroud) 当我在闪亮的应用程序中使用数据表对象时,我收到一个错误.
这个例子改编自Garrett Grolemund的这篇文章.将整个闪亮的应用程序打包到一个函数中,并在Rmd文件中呈现.要重现,请将以下代码放入R Studio中的.Rmd文件中,并使用ctrl-k http://shiny.rstudio.com/articles/function.html进行编译.
---
runtime: shiny
output: html_document
---
```{r echo = FALSE}
binner <- function(var) {
require(shiny)
shinyApp(
ui = fluidPage(
sidebarLayout(
sidebarPanel(sliderInput("n", "Bins", 5, 100, 20)),
mainPanel(plotOutput("hist"),
htmlOutput("SessionInfo")))),
server = function(input, output) {
output$hist <- renderPlot(hist(var, breaks = input$n, col = "skyblue", border = "white"))
output$SessionInfo <- renderText(paste(capture.output(sessionInfo()), collapse="<br>"))
}
)
}
```
## Old Faithful
Old faithful is known for erupting at regular intervals. But how regular are these intervals?
```{r echo = FALSE} …Run Code Online (Sandbox Code Playgroud) 我在Pretty git branch graphs中看到了很多很好的答案,它们显示了git log用于date的 oneline 选项。但是,当我运行这些命令时,我的输出不同,我看不到日期。选项--oneline和--date=<relative or iso>似乎不兼容。
结果为git log --date=iso:
结果为git log --date=iso --oneline:
我在三台不同的计算机上尝试了这个,结果相似。
链接的问题询问“如何提交日期”。也许他们的意思是“如何显示提交日期”,但就目前而言,问题尚不清楚。此外,在可能的副本中,OP 同时询问多个选项。我特别询问在使用该oneline选项时如何显示或打印日期(作者日期或提交日期)。另一个 OP 也与提交历史记录的大小有关,这也在我的问题范围之外。
也许可以编辑另一个问题以匹配这个问题,但是当我搜索这个问题时没有出现(虽然我没有git-log专门使用该标签,因为直到我搜索合适的标签我才注意到该标签我的问题的标签)。
另外,我知道没有其他有效的方法可以在不使用屏幕截图的情况下显示打印格式的结果,尤其是因为它们有颜色。对于它的价值,链接的问题也使用屏幕截图。
今天我注意到一些奇怪的事情,在某些情况下添加by=1功能seq会导致效率低下。
> system.time(seq(from=936144000, to=1135987200))
user system elapsed
0 0 0
> system.time(seq(from=936144000, to=1135987200, by=1))
user system elapsed
4.42 8.39 18.20
Run Code Online (Sandbox Code Playgroud)
乍一看,结果是相同的:
> all.equal(seq(from=936144000, to=1135987200),
+ seq(from=936144000, to=1135987200, by=1))
[1] TRUE
TRUE
Run Code Online (Sandbox Code Playgroud)
区别似乎在于,省略by=1会导致结果为数字,即使是by明确的整数。
> identical(seq(from=936144000, to=1135987200),
+ seq(from=936144000, to=1135987200, by=1))
[1] FALSE
> class(seq(from=936144000, to=1135987200))
[1] "integer"
> class(seq(from=936144000, to=1135987200, by=1L))
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)
此外,直接调用seq.int(假设这是在幕后发生的事情seq)也比不带任何参数的调用花费更长的时间seq:
> system.time(seq.int(from=936144000, to=1135987200, by=1L))
user system elapsed
0.25 1.68 2.81
Run Code Online (Sandbox Code Playgroud)
如何正确指定by以避免效率低下或获得省略的效率 …
我想使用data.table来计算摘要统计信息,然后根据该结果计算第二列的统计信息.
以下是使用空气质量数据的示例.
(假装它是这样来的)
library(data.table)
dt = as.data.table(airquality)
dt[ , Season:=ifelse(Month>7, 'Fall', 'Summer')]
Run Code Online (Sandbox Code Playgroud)
几个月有大风
## The range of monthly Wind values
dt[ , list(MinWind=min(Wind), MaxWind=max(Wind)),
by=c('Season', 'Month')]
---- R OUTPUT:
Season Month MinWind MaxWind
1: Summer 5 5.7 20.1
2: Summer 6 1.7 20.7
3: Summer 7 4.1 14.9
4: Fall 8 2.3 15.5
5: Fall 9 2.8 16.6
>
Run Code Online (Sandbox Code Playgroud)
我可以一步完成吗?
## Add a column to indicate if it was a high wind month
dt[, HighWind:=any(Wind>20), by=Month] …Run Code Online (Sandbox Code Playgroud)