在data.frame(或data.table)中,我想用最近的非NA值"填充"NA.一个简单的例子,使用向量(而不是a data.frame)如下:
> y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
Run Code Online (Sandbox Code Playgroud)
我想要一个fill.NAs()允许我构造的函数yy:
> yy
[1] NA NA NA 2 2 2 2 3 3 3 4 4
Run Code Online (Sandbox Code Playgroud)
我需要对许多(总计~1 Tb)小尺寸data.frames(~30-50 Mb)重复此操作,其中一行是NA,其所有条目都是.解决问题的好方法是什么?
我做的丑陋的解决方案使用这个功能:
last <- function (x){
x[length(x)]
}
fill.NAs <- function(isNA){
if (isNA[1] == 1) {
isNA[1:max({which(isNA==0)[1]-1},1)] <- 0 # first is NAs
# can't be forward filled
}
isNA.neg <- isNA.pos <- isNA.diff <- diff(isNA)
isNA.pos[isNA.diff < 0] <- …Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的数据集:
Month count
2009-01 12
2009-02 310
2009-03 2379
2009-04 234
2009-05 14
2009-08 1
2009-09 34
2009-10 2386
Run Code Online (Sandbox Code Playgroud)
我想绘制数据(月份为x值,计为y值).由于数据存在差距,我想将月份信息转换为日期.我试过了:
as.Date("2009-03", "%Y-%m")
Run Code Online (Sandbox Code Playgroud)
但它没有用.怎么了?似乎as.Date()也需要一天,并且无法设置当天的标准值?哪个功能解决了我的问题?
使用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)?
我一直在使用zoo我很久以前安装过的软件包.今天,我创建了一个新的R脚本,并运行library(zoo)并收到以下错误:
> library(zoo)
Error in library(zoo) : there is no package called ‘zoo’
Run Code Online (Sandbox Code Playgroud)
奇怪..但是,我尝试使用重新安装包install.packages("zoo"),并获得以下内容:
> install.packages("zoo")
Installing package(s) into ‘C:/Users/U122337.BOSTONADVISORS/Documents/R/win-library/2.15’
(as ‘lib’ is unspecified)
--- Please select a CRAN mirror for use in this session ---
trying URL 'http://cran.cnr.Berkeley.edu/bin/windows/contrib/2.15/zoo_1.7-10.zip'
Content type 'application/zip' length 874474 bytes (853 Kb)
opened URL
downloaded 853 Kb
package ‘zoo’ successfully unpacked and MD5 sums checked
Warning: cannot remove prior installation of package ‘zoo’
The downloaded binary packages are in …Run Code Online (Sandbox Code Playgroud) 很可能会暴露我是R的新手,但在SPSS中,运行滞后非常容易.显然这是用户错误,但我缺少什么?
x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds
Run Code Online (Sandbox Code Playgroud)
结果是:
x y
[1,] 4 4
[2,] 6 6
[3,] 3 3
[4,] 4 4
[5,] 3 3
[6,] 5 5
[7,] 8 8
[8,] 9 9
[9,] 3 3
[10,] 7 7
Run Code Online (Sandbox Code Playgroud)
我想我会看到:
x y
[1,] 4
[2,] 6 4
[3,] 3 6
[4,] 4 3
[5,] 3 4
[6,] 5 3
[7,] 8 5
[8,] 9 8
[9,] 3 9
[10,] …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,按日期的降序排列.
ps1 = data.frame(userID = c(21,21,21,22,22,22,23,23,23),
color = c(NA,'blue','red','blue',NA,NA,'red',NA,'gold'),
age = c('3yrs','2yrs',NA,NA,'3yrs',NA,NA,'4yrs',NA),
gender = c('F',NA,'M',NA,NA,'F','F',NA,'F')
)
Run Code Online (Sandbox Code Playgroud)
我希望将NA值用先前的值归入(替换)并按userID分组如果userID的第一行有NA,则替换为该用户ID组的下一组值.
我正在尝试使用像这样的dplyr和zoo软件包......但它不起作用
cleanedFUG <- filteredUserGroup %>%
group_by(UserID) %>%
mutate(Age1 = na.locf(Age),
Color1 = na.locf(Color),
Gender1 = na.locf(Gender) )
Run Code Online (Sandbox Code Playgroud)
我需要结果df像这样:
userID color age gender
1 21 blue 3yrs F
2 21 blue 2yrs F
3 21 red 2yrs M
4 22 blue 3yrs F
5 22 blue 3yrs F
6 22 blue 3yrs F
7 23 red 4yrs F
8 23 red 4yrs F
9 …Run Code Online (Sandbox Code Playgroud) 是否有某种方式使用rollapply(从zoo包装或类似的东西)优化功能(rollmean,rollmedian等)来计算与基于时间窗口的滚动功能,而不是一个基于的若干意见?我想要的很简单:对于不规则时间序列中的每个元素,我想计算一个带有N天窗口的滚动函数.也就是说,窗口应包括当前观察前N天的所有观察结果.时间序列也可能包含重复项.
以下是一个例子.鉴于以下时间序列:
date value
1/11/2011 5
1/11/2011 4
1/11/2011 2
8/11/2011 1
13/11/2011 0
14/11/2011 0
15/11/2011 0
18/11/2011 1
21/11/2011 4
5/12/2011 3
Run Code Online (Sandbox Code Playgroud)
具有5天窗口的滚动中位数(右侧对齐)应导致以下计算:
> c(
median(c(5)),
median(c(5,4)),
median(c(5,4,2)),
median(c(1)),
median(c(1,0)),
median(c(0,0)),
median(c(0,0,0)),
median(c(0,0,0,1)),
median(c(1,4)),
median(c(3))
)
[1] 5.0 4.5 4.0 1.0 0.5 0.0 0.0 0.0 2.5 3.0
Run Code Online (Sandbox Code Playgroud)
我已经找到了一些解决方案,但它们通常很棘手,通常意味着很慢.我设法实现了自己的滚动函数计算.问题是,对于非常长的时间序列,中位数(rollmedian)的优化版本可以产生巨大的时间差,因为它考虑了窗口之间的重叠.我想避免重新实现它.我怀疑rollapply参数有一些技巧可以使它工作,但我无法弄明白.在此先感谢您的帮助.
我正在使用zoo对象,买我的问题也适用于xts对象.它看起来像是一个带有索引的单列向量.在我的例子中,索引是日期的向量,而一列向量是我的数据.一切都很好,除了我想访问日期(从索引).
例如,我有以下结果:
ObjZoo <- structure(c(10, 20), .Dim = c(2L, 1L), index = c(14788, 14789),
class = "zoo", .Dimnames = list(NULL, "Data"))
unclass(ObjZoo)
# Data
# [1,] 10
# [2,] 20
# attr(,"index")
# [1] 14788 14789
Run Code Online (Sandbox Code Playgroud)
我想进入14789变量或向量,但我不知道如何访问它.
我有一个动物园时间序列,错过了几天.为了填补它并有一个连续的系列我做...
我从头到尾生成一个chron日期时间序列.
我把我的系列与这个合并.
我使用na.locf代替具有las遮挡的NAs.
我删除了syntetic chron序列.
我可以更容易吗?也许有一些与频率相关的指数函数?
我正在寻找R中滚动/滑动窗口函数方面的一些性能提升.这是一个非常常见的任务,可用于任何有序的观测数据集.我想分享一些我的发现,也许有人能够提供反馈,使其更快.
重要的是我专注于案例align="right"和自适应滚动窗口,因此width是一个向量(与我们的观察向量相同的长度).如果我们有width标量,那么已经有非常好的函数zoo和TTR包非常难以击败(4年后:它比我预期的要容易),因为其中一些甚至使用Fortran(但仍然是用户定义的)使用下面提到的FUN可以更快wapply.
RcppRoll由于其出色的性能,包值得值得一提,但到目前为止还没有能够回答这个问题的功能.如果有人可以扩展它以回答这个问题,那将会很棒.
考虑一下我们有以下数据:
x = c(120,105,118,140,142,141,135,152,154,138,125,132,131,120)
plot(x, type="l")
Run Code Online (Sandbox Code Playgroud)

我们希望在x带有可变滚动窗口的矢量上应用滚动函数width.
set.seed(1)
width = sample(2:4,length(x),TRUE)
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,我们将不得不滚动功能适应sample的c(2,3,4).
我们将应用mean功能,预期结果:
r = f(x, width, FUN = mean)
print(r)
## [1] NA NA 114.3333 120.7500 141.0000 135.2500 139.5000
## [8] 142.6667 147.0000 146.0000 131.5000 128.5000 131.5000 127.6667
plot(x, type="l")
lines(r, col="red")
Run Code Online (Sandbox Code Playgroud)

任何指标都可用于产生自width变量作为自适应移动平均线的不同变体或任何其他函数.
寻找最佳表现.
r ×10
zoo ×10
data.table ×3
time-series ×3
r-faq ×2
xts ×2
date ×1
dplyr ×1
fill ×1
install ×1
mapply ×1
missing-data ×1
package ×1
posix ×1
rollapply ×1