Hi Ferry,

It is not so elegant, but you can try

for (each_name in col_names) {

       sub.data <- subset( all.data,
                           !is.na( paste("NAME_", each_name, sep = '') ),
                           select = c( paste("NUM_", each_name, sep = '') ,
paste("NAME_", each_name, sep = '') )
                         )
    sub.data.2<-subset(sub.data, !is.na(sub.data[,2]))
       print(sub.data.2)
}


On Thu, Apr 9, 2009 at 6:30 PM, Ferry <[email protected]> wrote:

> Hi,
>
> I am trying to display / print certain columns in my data frame that share
> certain condition (for example, part of the column name). I am using for
> loop, as follow:
>
> # below is the sample data structure
> all.data <- data.frame( NUM_A = 1:5, NAME_A = c("Andy", "Andrew", "Angus",
> "Alex", "Argo"),
>                        NUM_B = 1:5, NAME_B = c(NA, "Barn", "Bolton",
> "Bravo", NA),
>                        NUM_C = 1:5, NAME_C = c("Candy", NA, "Cecil",
> "Crayon", "Corey"),
>                        NUM_D = 1:5, NAME_D = c("David", "Delta", NA, NA,
> "Dummy") )
>
> col_names <- c("A", "B", "C", "D")
>
> > all.data
>  NUM_A NAME_A NUM_B NAME_B NUM_C NAME_C NUM_D NAME_D
> 1     1   Andy     1   <NA>     1  Candy     1  David
> 2     2 Andrew     2   Barn     2   <NA>     2  Delta
> 3     3  Angus     3 Bolton     3  Cecil     3   <NA>
> 4     4   Alex     4  Bravo     4 Crayon     4   <NA>
> 5     5   Argo     5   <NA>     5  Corey     5  Dummy
> >
>
> Then for each col_names, I want to display the columns:
>
> for (each_name in col_names) {
>
>        sub.data <- subset( all.data,
>                            !is.na( paste("NAME_", each_name, sep = '') ),
>                            select = c( paste("NUM_", each_name, sep = '') ,
> paste("NAME_", each_name, sep = '') )
>                          )
>        print(sub.data)
> }
>
> the "incorrect" result:
>
> NUM_A NAME_A
> 1     1   Andy
> 2     2 Andrew
> 3     3  Angus
> 4     4   Alex
> 5     5   Argo
>  NUM_B NAME_B
> 1     1   <NA>
> 2     2   Barn
> 3     3 Bolton
> 4     4  Bravo
> 5     5   <NA>
>  NUM_C NAME_C
> 1     1  Candy
> 2     2   <NA>
> 3     3  Cecil
> 4     4 Crayon
> 5     5  Corey
>  NUM_D NAME_D
> 1     1  David
> 2     2  Delta
> 3     3   <NA>
> 4     4   <NA>
> 5     5  Dummy
> >
>
> What I want to achieve is that the result should only display the NUM and
> NAME that is not NA. Here, the NA can be NULL, or zero (or other specific
> values).
>
> the "correct" result:
>
> NUM_A NAME_A
> 1     1   Andy
> 2     2 Andrew
> 3     3  Angus
> 4     4   Alex
> 5     5   Argo
>  NUM_B NAME_B
>  2     2   Barn
> 3     3 Bolton
> 4     4  Bravo
>   NUM_C NAME_C
> 1     1  Candy
>  3     3  Cecil
> 4     4 Crayon
> 5     5  Corey
>  NUM_D NAME_D
> 1     1  David
> 2     2  Delta
> 5     5  Dummy
> >
>
> I am guessing that I don't use the correct type on the following statement
> (within the subset in the loop):
> !is.na( paste("NAME_", each_name, sep = '') )
>
> But then, I might be completely using a wrong approach.
>
> Any idea is definitely appreciated.
>
> Thank you,
>
> Ferry
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> [email protected] mailing list
> 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]]

______________________________________________
[email protected] mailing list
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.

Reply via email to