dplyr-使用可变的列名称进行突变

时间:2019-07-11 08:29:30

标签: r dplyr tibble

我有一个小标题,其中包含几天内各种血液参数(例如CRP)的时间序列。标题整齐,每个时间序列都在一列中,并且在测量日中也包含一列。小标题包含另一栏,其中包含一天的感染。如果Day变量大于InfectionDay,则我想用NA替换每个血液参数。由于我有很多变量,因此我希望有一个函数可以动态地接受列名,并通过在旧变量后附加“ _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 个答案:

答案 0 :(得分:1)

您可以将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")

答案 1 :(得分:0)

我们可以选择要在其上应用功能的列(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 <- tibble(Day=1:5, InfectionDay=3, CRP=c(3,2,5,4,1), CRP1 = c(3,2,5,4,1))