2
votes

I have a tibble containing time series of various blood parameters like CRP over the course of several days. The tibble is tidy, with each time series in one column, as well as a column for the day of measurement. The tibble contains another column with a day of infection. I want to replace each blood parameter with NA if the Day variable is greater-equal than the InfectionDay. Since I have a lot of variables, I'd like to have a function which accepts the column name dynamically and creates a new column name by appending "_censored" to the old one. I've tried the following:

censor.infection <- function(df, colname){
    newcolname <- paste0(colname, "_censored")
    return(df %>% mutate(!!newcolname := ifelse( Day < InfectionDay, !!colname, NA)))
}

data = tibble(Day=1:5, InfectionDay=3, CRP=c(3,2,5,4,1))
data = censor.infection(data, "CRP")

Running this, I expected

# A tibble: 5 x 4
    Day InfectionDay   CRP CRP_censored
  <int>        <dbl> <dbl> <chr>       
1     1            3     3 3         
2     2            3     2 2         
3     3            3     5 NA          
4     4            3     4 NA          
5     5            3     1 NA 

but I get

# A tibble: 5 x 4
    Day InfectionDay   CRP CRP_censored
  <int>        <dbl> <dbl> <chr>       
1     1            3     3 CRP         
2     2            3     2 CRP         
3     3            3     5 NA          
4     4            3     4 NA          
5     5            3     1 NA 
2

2 Answers

3
votes

You can add sym() to the column name in mutate to convert to symbol before evaluating

censor.infection <- function(df, colname){
  newcolname <- paste0(colname, "_censored")
  return(df %>% mutate(!!newcolname := ifelse( Day < InfectionDay, !! sym(colname), NA)))
}

data = tibble(Day=1:5, InfectionDay=3, CRP=c(3,2,5,4,1))
data = censor.infection(data, "CRP")
0
votes

We can select columns on which we want to apply the function (cols) and use mutate_at which will also automatically rename the columns. Added an extra column in the data to show renaming.

library(dplyr)
cols <- c("CRP", "CRP1")

data %>%
  mutate_at(cols, list(censored = ~replace(., Day >= InfectionDay, NA)))

# A tibble: 5 x 6
#    Day InfectionDay   CRP  CRP1 CRP_censored CRP1_censored
#  <int>        <dbl> <dbl> <dbl>        <dbl>         <dbl>
#1     1            3     3     3            3             3
#2     2            3     2     2            2             2
#3     3            3     5     5           NA            NA
#4     4            3     4     4           NA            NA
#5     5            3     1     1           NA            NA

data

data <- tibble(Day=1:5, InfectionDay=3, CRP=c(3,2,5,4,1), CRP1 = c(3,2,5,4,1))