dplyr - изменять имена столбцов переменных - PullRequest
2 голосов
/ 11 июля 2019

У меня есть тиббл, содержащий временные ряды различных показателей крови, таких как СРБ, в течение нескольких дней. Столбик аккуратный, с каждым временным рядом в одном столбце, а также столбцом для дня измерения. Тиббл содержит еще одну колонку с указанием дня заражения. Я хочу заменить каждый параметр крови на NA, если переменная Day больше или равна InfectionDay. Поскольку у меня много переменных, я хотел бы иметь функцию, которая динамически принимает имя столбца и создает новое имя столбца, добавляя «_censored» к старому. Я пробовал следующее:

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")

Запустив это, я ожидал

# 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 

но я получаю

# 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 ]

1 голос
/ 11 июля 2019

Вы можете добавить sym() к имени столбца в mutate, чтобы преобразовать в символ перед вычислением

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 голосов
/ 11 июля 2019

Мы можем выбрать столбцы, к которым мы хотим применить функцию (cols) и использовать mutate_at, которая также автоматически переименует столбцы.Добавлен дополнительный столбец в данных для отображения переименования.

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))
...