how do I search for columns with same name, add the column values and replace these columns with same name by their sum? Using R

后端 未结 4 635
情话喂你
情话喂你 2021-01-05 20:56

I have a data frame where some consecutive columns have the same name. I need to search for these, add their values in for each row, drop one column and replace the other wi

4条回答
  •  时光说笑
    2021-01-05 21:00

    > dfrm <- data.frame(a = 1:10, b= 1:10, cc= 1:10, dd=1:10, ee=1:10)
    > names(dfrm) <- c("a", "a", "b", "b", "b")
    > sapply(unique(names(dfrm)[duplicated(names(dfrm))]), 
          function(x) Reduce("+", dfrm[ , grep(x, names(dfrm))]) )
           a  b
     [1,]  2  3
     [2,]  4  6
     [3,]  6  9
     [4,]  8 12
     [5,] 10 15
     [6,] 12 18
     [7,] 14 21
     [8,] 16 24
     [9,] 18 27
    [10,] 20 30
    

    EDIT 2: Using rowSums allows simplification of the first sapply argumentto just unique(names(dfrm)) at the expense of needing to remember to include drop=FALSE in "[":

    sapply(unique(names(dfrm)), 
           function(x) rowSums( dfrm[ , grep(x, names(dfrm)), drop=FALSE]) )
    

    To deal with NA's:

    sapply(unique(names(dfrm)), 
          function(x) apply(dfrm[grep(x, names(dfrm))], 1, 
                  function(y) if ( all(is.na(y)) ) {NA} else { sum(y, na.rm=TRUE) }
           )               )
    

    (Edit note: addressed Tommy counter-example by putting unique around the names(.)[.] construction. The erroneous code was:

    sapply(names(dfrm)[unique(duplicated(names(dfrm)))], 
         function(x) Reduce("+", dfrm[ , grep(x, names(dfrm))]) )
    

提交回复
热议问题