AnesG
AnesG

Reputation: 275

How to join (merge) columns in a data frame, replacing NA values

I have this data frame, whit 4 columns, which i need is merge column B,C and D in a new column

Thanks

  A         B           C          D
1.40  Fria Moderada     NA         NA
-1.17 Fria Debil        NA         NA
-0.85       NA          NA         Neutro
-0.74       NA          NA         Neutro
 0.58       NA      Calida Debil   NA
 1.29       NA     Calida Moderada NA

Upvotes: 1

Views: 2021

Answers (3)

TarJae
TarJae

Reputation: 78917

Simple, but it works, or am I wrong?

d[is.na(d)]<-"" #removes the NAs (code used by Dave2e)
d$newcol <- paste(d$B,d$C,d$D, sep = "")

Upvotes: 0

akrun
akrun

Reputation: 886948

If it always have only a single non-NA value per row for columns "B" to "D", we can use pmax from base R

cbind(d[1], newcol=do.call(pmax, c(d[-1], list(na.rm=TRUE))))
#    A          newcol
#1  1.40   Fria Moderada
#2 -1.17      Fria Debil
#3 -0.85          Neutro
#4 -0.74          Neutro
#5  0.58    Calida Debil
#6  1.29 Calida Moderada

Upvotes: 3

Dave2e
Dave2e

Reputation: 24069

The package tidyr has the function unite which does the trick:

#Sample Data
#dput(d)    
d<-structure(list(A = c(1.4, -1.17, -0.85, -0.74, 0.58, 1.29), B = c("Fria Moderada", 
          "Fria Debil", NA, NA, NA, NA), C = c(NA, NA, NA, NA, "Calida Debil", 
          "Calida Moderada"), D = c(NA, NA, "Neutro", "Neutro", NA, NA)), .Names = c("A", 
          "B", "C", "D"), class = "data.frame", row.names = c(NA, -6L))


library(tidyr)
d[is.na(d)]<-"" #removes the NAs
unite(d, newcol, c(B, C, D), sep="")

Upvotes: 4

Related Questions