[R] coalesce columns within a data frame

Ivan Alves papucho at mac.com
Wed Oct 22 18:09:31 CEST 2008


Dear all,
Thanks for all the replies.
I get something with Duncan's code (slightly more compact than the  
other two), but of class "integer", whereas the two inputs are class  
"factor".  Clearly the name information is lost.  I did not see  
anything on this in the help page for ifelse.

On this experience I also tried
df$Name <- df$NAME.x
df[is.na(df$NAME.x),"Name"] <- df[is.na(df $NAME.x),"NAME.y"]

but then again the "factor" issue was a problem (clearly the levels  
are not the same and then there is a conflict)

Any further guidance?
Kind regards,
Ivan

On 22 Oct 2008, at 17:26, Duncan Murdoch wrote:

> On 10/22/2008 11:21 AM, Ivan Alves wrote:
>> Dear all,
>> I searched the mail archives and the R site and found no guidance   
>> (tried "merge", "cbind" and terms like "coalesce" with no  
>> success).   There surely is a way to coalesce (like in SQL) columns  
>> in a  dataframe, right?  For example, I would like to go from a  
>> dataframe  with two columns to one with only one as follows:
>> From
>> Name.x Name.y
>> nx1 ny1
>> nx2 NA
>> NA ny3
>> NA NA
>> ...
>> To
>> Name
>> nx1
>> nx2
>> ny3
>> NA
>> ...
>> where column Name.x is taken if there is a value, and if not then   
>> column Name.y
>> Any help would be appreciated
>
> I don't know of any special function to do that, but ifelse() can  
> handle it easily:
>
> Name <- ifelse(is.na(Name.x), Name.y, Name.x)
>
> (If those are columns of a dataframe named df, you'd prefix each  
> column name by df$, or do
>
> within(df, Name <- ifelse(is.na(Name.x), Name.y, Name.x))
>
> Duncan Murdoch



More information about the R-help mailing list