有没有人开发出一种优雅,快速的方式来按日期执行滚动总和?例如,如果我想通过Cust_ID为以下数据集创建一个180天的滚动总计,有没有办法更快地完成它(比如data.table中的某些内容).我一直在使用以下示例来计算滚动总和,但恐怕效率低得多.
library("zoo")
library("plyr")
library("lubridate")
##Make some sample variables
set.seed(1)
Trans_Dates <- as.Date(c(31,33,65,96,150,187,210,212,240,273,293,320,
32,34,66,97,151,188,211,213,241,274,294,321,
33,35,67,98,152,189,212,214,242,275,295,322),origin="2010-01-01")
Cust_ID <- c(rep(1,12),rep(2,12),rep(3,12))
Target <- rpois(36,3)
##Combine into one dataset
Example.Data <- data.frame(Trans_Dates,Cust_ID,Target)
##Create extra variable with 180 day rolling sum
Example.Data2 <- ddply(Example.Data, .(Cust_ID),
function(datc) adply(datc, 1,
function(x) data.frame(Target_Running_Total =
sum(subset(datc, Trans_Dates>(as.Date(x$Trans_Dates)-180) & Trans_Dates<=x$Trans_Dates)$Target))))
#Print new data
Example.Data2
Run Code Online (Sandbox Code Playgroud) 我试图更好地掌握data.table包中的一些特殊变量是如何工作的.其中之一就是.BY声明.我没有看到很多人使用它的例子,但是文档暗示在绘图中很有用.
例如,下面的代码似乎工作得很好(显示每个物种的图,并为每个图分配正确的标题)data.table 1.9.3:
iris <- data.table(iris)
iris[,plot(Sepal.Length ~ Sepal.Width, main = unlist(.BY)), by = Species]
Run Code Online (Sandbox Code Playgroud)
虽然此代码不符合我的意图:
iris[ , plot(Sepal.Length ~ Sepal.Width, main = .BY), by = Species]
Run Code Online (Sandbox Code Playgroud)
为什么这两个不同?从评论来看,它似乎不是一个问题data.table 1.9.2.在其他方面使用该.BY声明可能有用吗?与.EACHI声明相比,这有何不同?
我有一个缺少许多值的数据集。一些缺失值是NA,一些缺失值是Null,而其他缺失值的长度却有所不同。我想利用该fread函数R来读取所有这些缺少的值。
这是一个例子:
#Find fake data
iris <- data.table(iris)[1:5]
#Add missing values non-uniformly
iris[1,Species:=' ']
iris[2,Species:=' ']
iris[3,Species:='NULL']
#Write to csv and read back in using fread
write.csv(iris,file="iris.csv")
fread("iris.csv",na.strings=c("NULL"," "))
V1 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 1 5.1 3.5 1.4 0.2
2: 2 4.9 3.0 1.4 0.2 NA
3: 3 4.7 3.2 1.3 0.2 NA
4: 4 4.6 3.1 1.5 0.2 setosa
5: 5 5.0 3.6 1.4 0.2 setosa
Run Code Online (Sandbox Code Playgroud)
从上面的示例中,我们看到我无法解决第一个缺失值,因为有很多空格。有人知道一种解决方法吗?
我目前正在为我正在进行的生态项目构建密度对象.该density函数R非常适合将密度函数拟合到我的数据中.
我如何使用该density功能的示例如下所示:
dens.iris <- density(iris$Sepal.Length, bw = "bcv")
Run Code Online (Sandbox Code Playgroud)
这非常有效.但是,该predict功能似乎不适用于density对象.有没有人知道一种方法来提取特定点的密度值(例如在iris数据集中,提取Sepal.Length为6.432)?我必须使用一种biased cross validation技术.
我有一个相当大的数据集,我有兴趣根据另一列的值向前推进"行进"值.例如,如果我有一个Value = 3at Time = 0和a DesiredShift = 2,我希望3将两行向下移动到Time = 2.这是一个可重复的例子.
library(data.table)
set.seed(1)
rowsPerID <- 8
dat <- CJ(1:2, 1:rowsPerID)
setnames(dat, c("ID","Time"))
dat[, Value := rpois(.N, 4)]
dat[, Shift := sample(0:2, size=.N, replace=TRUE)]
Run Code Online (Sandbox Code Playgroud)
# ID Time Value Shift
# 1: 1 1 3 2
# 2: 1 2 3 2
# 3: 1 3 4 1
# 4: 1 4 7 2
# 5: 1 5 2 2
# 6: 1 6 …Run Code Online (Sandbox Code Playgroud) 是否有更优雅的方法将变量列表转换为data.table对象?
这不会产生预期的结果.
require(data.table)
set.seed(1)
Var.List <- list(a=sample(letters, 10, rep=T),b=rnorm(10), c=rnorm(10))
data.table(Var.List)
Run Code Online (Sandbox Code Playgroud)
以下确实给出了期望的结果,但是对于大列表/表格来说速度很慢.有没有更好的办法?在汇总来自foreach包的结果时,我经常遇到这个问题.
data.table(as.data.frame(Var.List))
a b c
1: g -0.8204684 -0.04493361
2: j 0.4874291 -0.01619026
3: o 0.7383247 0.94383621
4: x 0.5757814 0.82122120
5: f -0.3053884 0.59390132
6: x 1.5117812 0.91897737
7: y 0.3898432 0.78213630
8: r -0.6212406 0.07456498
9: q -2.2146999 -1.98935170
10: b 1.1249309 0.61982575
Run Code Online (Sandbox Code Playgroud) 我有一个如下数据集:
structure(list(Info = c("Acacia melanoceras 0.0369 0.0427 0.0267 0.0298 0.0501 0.0042 ",
"Acalypha diversifolia van 0.0670 0.0439 0.0281 0.0427 0.0464 -0.0148 ",
"Acalypha macrostachya vin 0.0657 0.0621 0.0441 0.0522 0.0473 -0.0173 ",
"Adelia triloba 0.0481 0.0350 0.0202 0.0174 0.0286 -0.0349 ",
"Aegiphila panamensis 0.0437 0.0312 0.0166 0.0148 0.0194 -0.0497 ",
"Alchornea costaricensis 0.0568 0.0781 0.0502 0.0221 0.0734 -0.0153 "
)), .Names = "Info", row.names = c(NA, 6L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
它目前只有一列,看起来像这样
Info
1 Acacia melanoceras 0.0369 0.0427 0.0267 0.0298 0.0501 …Run Code Online (Sandbox Code Playgroud)