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]]
Hi Ek, As I may have mentioned previously, if you don't mind stepping through the data frame row by row you can do it like this: eedf<-read.table(text="nam,val mandy,1 ,2 John,3 ,4 ,5 ,6 Zara,7 ,8",sep=",",header=TRUE,stringsAsFactors=FALSE) for(row in 1:nrow(eedf)) if(eedf$nam[row] == "") eedf$nam[row]<-eedf$nam[row-1] Jim On Thu, Aug 10, 2017 at 7:20 AM, 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.
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]]