[R] Reshaping dataframes

David Winsemius dwinsemius at comcast.net
Thu Aug 23 18:09:24 CEST 2012


On Aug 23, 2012, at 2:02 AM, Ingmar Schuster wrote:

> Thanks Rui!
>
> Anybody with ideas regarding filling _while_ binding data frames  
> instead of
> afterwards?

Not sure what you mean by " _while_ binding dataframes" but the  
original question seems answered by this sentence from the help file  
for factor:

"For a numeric x, set exclude=NULL to make NA an extra level (prints  
as <NA>); by default, this is the last level."

fac <- factor(fac, exclude=NULL) # would skip all that `is.na()`,  
`level=` gymnastics


If you want to loop over factor dataframe columns:

facidx <-  sapply(d, is.factor)
d[ ,facidx ] <- lapply( d[ , facidx ], factor, exclude=NULL)

I see no parameters to data.frame or read.table that would allow  
specifying different than the default behavior for factor().

-- 
David

>
> Ingmar
>
> 2012/8/22 Rui Barradas <ruipbarradas at sapo.pt>
>
>> Hello,
>>
>> Your function doesn't seem to be very difficult to generalize.
>>
>> d <- read.table(text="
>>
>>   trg_type child_type_1
>> 1 Scientists NA
>> 2        of         used
>> ", header=TRUE)
>> str(d)
>>
>> subs_na <- function(tok, na_factor_level = "NOT_REALIZED", na_num =  
>> 99999)
>> {
>>    ifac <- which(sapply(tok, is.factor))
>>    inum <- which(sapply(tok, is.numeric))
>>    for(i in ifac) {
>>        levels(tok[, i]) <- c(levels(tok[, i]), na_factor_level)
>>        tok[is.na(tok[, i]), i] <- as.factor(na_factor_level)
>>    }
>>    for(i in inum)
>>        tok[is.na(tok[, i]), i] <- na_num
>>    tok
>> }
>>
>> r1 <- substitute_na(d)
>> r2 <- subs_na(d)
>> str(r1)
>> str(r2)
>> identical(r1, r2)  # TRUE
>>
>> You could use the same coding for characters, Dates, etc.
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Em 22-08-2012 20:16, Ingmar Schuster escreveu:
>>
>> Hi,
>>>
>>> I have a data set with variables that are _not_ missing at random.  
>>> Now I
>>> use a package for learning a Bayesian Network which won't accept  
>>> NA as a
>>> value. From a database I query data.frames with k,k+n,k+2n, ...  
>>> variables
>>> (there are always at least k variables as leftmost columns). Using
>>> rbind.fill from the reshape package on two data frames I would get  
>>> a data
>>> frame like
>>>
>>>    trg_type child_type_1
>>> 1 Scientists NA
>>> 2        of         used
>>>
>>> Now to get rid of NA values I use the following function, which  
>>> works for
>>> data frames with only factor values:
>>>
>>>   substitute_na <- function(tok, na_factor_level = "NOT_REALIZED") {
>>>     for (i in 1:length(tok)) {levels(tok[,i]) <- c(levels(tok[,i]),
>>> na_factor_level)}
>>>     tok[is.na(tok)] <- as.factor(na_factor_level)
>>>     return(tok)
>>>   }
>>>
>>> Is there a better/faster way to do it? It would also be great to  
>>> be able
>>> to
>>> distinguish factor columns from numeric columns and use a special  
>>> numeric
>>> value there. The current version of rbind.fill makes no direct  
>>> reference
>>> to
>>> the fill value so that I could change its implementation for my  
>>> purpose.
>>>
>>>
>>> Thanks!
>>>
>>> Ingmar
>>>
>>>
>>
>
>
> -- 
> Ingmar Schuster
> Natural Language Processing Group
> Department of Computer Science
> University of Leipzig
> Johannisgasse 26
> 04103 Leipzig, Germany
>
> Tel. +49 341 9732205
>
> http://asv.informatik.uni-leipzig.de/en/staff/Ingmar_Schuster
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org 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.

David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list