Fill in empty spaces modified

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Fill in empty spaces modified

Ek Esawi
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]]

______________________________________________
[hidden email] 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.
Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Fill in empty spaces modified

Jim Lemon-4
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 <[hidden email]> 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]]
>
> ______________________________________________
> [hidden email] 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.

______________________________________________
[hidden email] 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.
Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Fill in empty spaces modified

R help mailing list-2
In reply to this post by Ek Esawi
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 <[hidden email]> 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]]
>
> ______________________________________________
> [hidden email] 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]]

______________________________________________
[hidden email] 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.
Loading...