r - dplyr - 使用可变列名称进行变异

标签 r dplyr tibble

我有一个 tibble,其中包含几天内 CRP 等各种血液参数的时间序列。 tibble 很整洁,每个时间序列都在一列中,还有一列用于测量日期。 tibble 包含另一列感染日期。如果日变量大于感染日,我想用 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 

最佳答案

你可以在 mutate 中的列名中添加 sym() 以在计算之前转换为符号

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

关于r - dplyr - 使用可变列名称进行变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56984824/

相关文章:

r - 将每日数据汇总为几周

r - 我不想保留用于创建 data.table 子集的列。我怎样才能做到这一点?

r - 从数据框中提取单独的列

r - 在 R 中扩展电子邮件数据集的标题

r - 为多个操作系统使用并行或 doParallel 的自定义包作为 CRAN 包

r - 在 R 中加入多个 OR 语句

r - 使用其他动态列名更改具有条件的动态列名

r - 如何将参数传递给函数内的 dplyr 连接函数?

r - 在创建列表 tibble 列时在 "mutation"中使用 dplyr::sym() 会导致错误 is_symbol(x): object '.x' not found