dplyr - 使用变量列名进行 mutate

4
我有一个数据表,其中包含多种血液参数(如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个回答

4

你可以在 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")

1
为什么 !!sym(variable_col_name) 起作用? - Kalaschnik

2
我们可以选择要应用函数的列(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))

1
作为一名微生物学家,我非常喜欢在StackOverflow上看到医学相关的例子,特别是关于传染病方面的:D。这种双重联系真是太好了!SO在不同领域之间建立联系的方式真是太棒了。 - MS Berends

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接