[R] Fill in empty spaces modified
William Dunlap
wdunlap at tibco.com
Thu Aug 10 02:56:13 CEST 2017
The following, locf2(), does what you want using only base R functions:
locf2 <-
function(x, initial=NA, IS_BAD = is.na) {
# Replace 'bad' values in 'x' with last previous non-bad value.
# If no previous non-bad value, replace with 'initial'.
stopifnot(is.function(IS_BAD))
good <- !IS_BAD(x)
stopifnot(is.logical(good), length(good) == length(x), !anyNA(good))
i <- cumsum(good)
x <- x[c(1,which(good))][i+1]
x[i==0] <- initial
x
}
In your example, you can use IS_BAD=function(x)x=="" or function(x)is.na(x)
| x==""
> df1 <- data.frame(nam=c("mandy","", "John","","","","Zara",""),
+ val=c(1,2,3,4,5,6,7,8))
> cbind(df1, FilledNam = locf2(df1$nam, IS_BAD=function(x)x==""))
nam val FilledNam
1 mandy 1 mandy
2 2 mandy
3 John 3 John
4 4 John
5 5 John
6 6 John
7 Zara 7 Zara
8 8 Zara
>
Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Wed, Aug 9, 2017 at 2:20 PM, Ek Esawi <esawiek at gmail.com> wrote:
> Hi All—
>
> I was looking at a posting from June-17. I managed to solve it. However,
> when I changed the example in the posting, my solution will work only once
> at a time which was mentioned by Jim Lemon on his response to the original
> posting. This means that my solution will have to be repeated as many times
> as the maximum number of spaces on each gap; something that may not work
> well for large files.
>
> I am trying to solve the new example with base R functions only. I thought
> of splitting the first column to multiple lists and use one of the apply
> functions, but was not successful.
>
> Would apprecaite some hints on how to go about it.
>
> Thanks as always in advance—EK
>
> The posted data frame from the original posting:
> names val
> 1 Mandy 1
> 2 2
> 3 John 2
> 4 2
>
> My modified data frame:
> val <- c(1,2,3,4,5,6,7,8)
> nam <- c("mandy","", "John","","","","Zara","")
> df1 <- data.frame(nam,val)
>
> nam val
> 1 mandy 1
> 2 2
> 3 John 3
> 4 4
> 5 5
> 6 6
> 7 Zara 7
> 8 8
>
> My code for solving the original data farme
> > which(df1$nam=="")
> > a <- which(df1$nam=="")
> > df1$nam[a] <- df1$nam[a-1]
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/
> posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
[[alternative HTML version deleted]]
More information about the R-help
mailing list