簡體   English   中英

dplyr - 使用可變列名進行變異

[英]dplyr - mutate with variable column names

我有一個包含各種血液參數(如 CRP)在幾天內的時間序列的 tibble。 tibble 很整潔,每個時間序列在一列中,還有一列用於測量當天。 tibble 包含另一個帶有感染日的列。 如果 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 

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

我們可以選擇要應用函數的列( 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM