R 在向量中传播数据
我在学习R,我很好奇。。。我需要一个函数来实现这一点:R 在向量中传播数据,r,vector,R,Vector,我在学习R,我很好奇。。。我需要一个函数来实现这一点: > fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)) [1] 1 1 1 2 3 3 4 > fillInTheBlanks(c(1, 2, 3, 4)) [1] 1 2 3 4 我制作了这个。。。但我怀疑有一种更为简单的方法可以做到这一点 fillInTheBlanks <- function(v) { ## replace each NA with the latest pre
> fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4))
[1] 1 1 1 2 3 3 4
> fillInTheBlanks(c(1, 2, 3, 4))
[1] 1 2 3 4
我制作了这个。。。但我怀疑有一种更为简单的方法可以做到这一点
fillInTheBlanks <- function(v) {
## replace each NA with the latest preceding available value
orig <- v
result <- v
for(i in 1:length(v)) {
value <- v[i]
if (!is.na(value))
result[i:length(v)] <- value
}
return(result)
}
FillingblanksPackagezoo
有一个函数na.locf()
:
na.locf
:最后一次观察结转;
用于将每个“NA”替换为之前的最新非“NA”的通用函数
查看函数的源代码na.locf.default
,它不需要进行循环。我正在从zoo库进行一些最小的复制和粘贴(再次感谢rcs指点我),这是我真正需要的:
fillInTheBlanks <- function(S) {
## NA in S are replaced with observed values
## accepts a vector possibly holding NA values and returns a vector
## where all observed values are carried forward and the first is
## also carried backward. cfr na.locf from zoo library.
L <- !is.na(S)
c(S[L][1], S[L])[cumsum(L)+1]
}
FillingBlanks只是为了好玩(因为它比FillingBlanks
慢),这里有一个版本的na.locf
依赖于rle
功能:
my.na.locf <- function(v,fromLast=F){
if(fromLast){
return(rev(my.na.locf(rev(v))))
}
nas <- is.na(v)
e <- rle(nas)
v[nas] <- rep.int(c(NA,v[head(cumsum(e$lengths),-1)]),e$lengths)[nas]
return(v)
}
my.na.locf另一个简单的答案。这一个处理第一个值NA。这是一个死胡同,所以我的循环数据来自索引2
my_vec <- c(1, NA, NA, 2, 3, NA, 4)
fill.it <- function(vector){
new_vec <- vector
for (i in 2:length(new_vec)){
if(is.na(new_vec[i])) {
new_vec[i] <- new_vec[i-1]
} else {
next
}
}
return(new_vec)
}
my_vec多个R包都包含了一个na.locf函数,它正是这样做的。(输入、动物园、时空等)
以下是一个使用输入的示例:
library("imputeTS")
x <- c(1, NA, NA, 2, 3, NA, 4)
na.locf(x)
库(“输入项”)
x及其fromLast参数解决了对称问题!(我现在正在读na.locf.R的代码,里面有很多值得一读的东西)有趣的源代码。我在添加另一个答案,从你和动物园图书馆中提炼而来。
my_vec <- c(1, NA, NA, 2, 3, NA, 4)
fill.it <- function(vector){
new_vec <- vector
for (i in 2:length(new_vec)){
if(is.na(new_vec[i])) {
new_vec[i] <- new_vec[i-1]
} else {
next
}
}
return(new_vec)
}
library("imputeTS")
x <- c(1, NA, NA, 2, 3, NA, 4)
na.locf(x)