একটি ডেটা.ফ্রেমে (বা ডেটা টেটেবল), আমি নিকটবর্তী পূর্ববর্তী নন-এনএ মান সহ এনএগুলি "পূরণ করতে" চাই। একটি সহজ উদাহরণ, ভেক্টর ব্যবহার করে (ক এর পরিবর্তে data.frame
) নিম্নলিখিত:
> y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
আমি এমন একটি ফাংশন চাই fill.NAs()
যা আমাকে এমন নির্মাণ করতে দেয় yy
:
> yy
[1] NA NA NA 2 2 2 2 3 3 3 4 4
আমাকে অনেকগুলি (মোট ~ 1 টিবি) ছোট আকারের data.frame
(-30-50 এমবি) এর জন্য এই ক্রিয়াকলাপটি পুনরাবৃত্তি করতে হবে , যেখানে একটি সারির এনএ হ'ল সমস্ত প্রবেশিকা রয়েছে। সমস্যাটির কাছে যাওয়ার ভাল উপায় কী?
আমি যে কুৎসিত সমাধানটি রান্না করেছি তা এই ফাংশনটি ব্যবহার করে:
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] <- 0
isNA.neg[isNA.diff > 0] <- 0
which.isNA.neg <- which(as.logical(isNA.neg))
if (length(which.isNA.neg)==0) return(NULL) # generates warnings later, but works
which.isNA.pos <- which(as.logical(isNA.pos))
which.isNA <- which(as.logical(isNA))
if (length(which.isNA.neg)==length(which.isNA.pos)){
replacement <- rep(which.isNA.pos[2:length(which.isNA.neg)],
which.isNA.neg[2:max(length(which.isNA.neg)-1,2)] -
which.isNA.pos[1:max(length(which.isNA.neg)-1,1)])
replacement <- c(replacement, rep(last(which.isNA.pos), last(which.isNA) - last(which.isNA.pos)))
} else {
replacement <- rep(which.isNA.pos[1:length(which.isNA.neg)], which.isNA.neg - which.isNA.pos[1:length(which.isNA.neg)])
replacement <- c(replacement, rep(last(which.isNA.pos), last(which.isNA) - last(which.isNA.pos)))
}
replacement
}
ফাংশনটি fill.NAs
নিম্নরূপ ব্যবহৃত হয়:
y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
isNA <- as.numeric(is.na(y))
replacement <- fill.NAs(isNA)
if (length(replacement)){
which.isNA <- which(as.logical(isNA))
to.replace <- which.isNA[which(isNA==0)[1]:length(which.isNA)]
y[to.replace] <- y[replacement]
}
আউটপুট
> y
[1] NA 2 2 2 2 3 3 3 4 4 4
... যা কাজ করে বলে মনে হচ্ছে। কিন্তু, মানুষ, এটা কি কুরুচিপূর্ণ! কোনও পরামর্শ?
fill
এR
tidyr::fill()
।
roll=TRUE
সন্ধান করেছেনdata.table
।