In fact you can use only
for (each_name in col_names) {
sub.data <- subset( all.data,
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)
}
Because:
!is.na( paste("NAME_", each_name, sep = '') )
only test if the result of the paste() is not null, and never will be null.
Maybe you need to improve and way of evaluate if the expression
that paste() result is null or not... but I don't know how do that.
bests..
miltinho
On Thu, Apr 9, 2009 at 11:30 PM, milton ruser <[email protected]>wrote:
> 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<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.