Geoff
Geoff

Reputation: 23

Normalize specified columns in dplyr by value in first row

I have a data frame with four rows, 23 numeric columns and one text column. I'm trying to normalize all the numeric columns by subtracting the value in the first row.

I've tried getting it to work with mutate_at, but I couldn't figure out a good way to get it to work.

I got it to work by converting to a matrix and converting back to a tibble:

## First, did some preprocessing to get out the group I want
totalNKFoldChange <- filter(signalingFrame,
                            Population == "Total NK") %>% ungroup

totalNKFoldChange_mat <- select(totalNKFoldChange, signalingCols) %>%
    as.matrix()

normedNKFoldChange <- sweep(totalNKFoldChange_mat,
                            2, totalNKFoldChange_mat[1,])

normedNKFoldChange %<>% cbind(Timepoint = 
                              levels(totalNKFoldChange$Timepoint)) %>% 
    as.tibble %>%
    mutate(Timepoint = factor(Timepoint,
                              levels = levels(totalNKFoldChange$Timepoint)))

I'm so certain there's a nicer way to do it that would be fully dplyr native. Anyone have tips? Thank you!!

Upvotes: 1

Views: 1037

Answers (1)

akrun
akrun

Reputation: 887028

If we want to normalize all the numeric columns by subtracting the value in the first row, use mutate_if

library(dplyr)
df1 %>%
     mutate_if(is.numeric, list(~ .- first(.)))

Upvotes: 2

Related Questions