簡體   English   中英

使用 mutate 和 case_when (R) 通過多個條件創建新變量的函數

[英]Function to create new variable by multiple conditions using mutate and case_when (R)

我正在嘗試創建一個函數來比較變量 1 和 2,並根據它們是否匹配創建第三個變量。 我需要這樣做 > 25 次(對於不同的變量組合),這就是為什么我想創建一個函數而不是僅僅使用 mutate 和 case_when。

我對 R 很陌生,所以這主要是從其他有用的堆棧溢出帖子和雜項教程拼湊而成的。

這是我嘗試過的:

determine_match <- function(df, col_a, col_b){


col_a <- enquo(col_a)
  col_b <- enquo(col_b)
  newvar <- paste0(quo_name(col_a), quo_name(col_b))
  df <- df %>% mutate(!!newvar:= case_when(
    !!col_a == '1' & !!col_b =='Yes' ~ 'Match',
    !!col_a == '0' & !! col_b == 'No' ~ 'Match',
    !!col_a == '1' & !!col_b == 'No' ~ 'No Match',
    !!col_a == '0' & !!col_b == 'Yes' ~ 'No Match',
    is.na(!!col_a) | is.na(!!col_b) ~ NA_character_,
    TRUE ~ 'Error'
  )) 
}

我在這個數據集上測試了它:

test1 <- c('1', '0', '1', '1', '0', NA)
test2 <- c('Yes', 'No', 'No,', NA, 'Yes', NA)
id <- c(1,2,3,4,5,6)
testing.df <- data.frame(id, test1, test2)

我沒有收到錯誤,但是當我使用打印語句運行該函數時,它只返回 newvar 的字符串名稱,而不會更改實際的數據框。

我也試過testing.df %>% mutate(testing3 = funs(determine_match(testing.df, testing1, testing2)))testing.df %>% mutate(testing3 = funs(determine_match(testing.df, testing1, testing2)))給了我~determine_match(testing.df, testing1, testing2)

不確定問題是功能問題還是應用嘗試問題,還是兩者兼而有之。

希望好心人幫幫忙,謝謝!!

您需要return結果,添加return(df) (甚至只是df )作為函數的最后一行。

如果您不擔心除您明確提及的輸入值以外的輸入值( "0""1"NA表示col_a"Yes""No"NA表示col_b ),您可以將條件簡化為這(對於“簡化”的某些定義——它肯定更短)。

determine_match <- function(df, col_a, col_b) {
  col_a <- enquo(col_a)
  col_b <- enquo(col_b)
  newvar <- paste0(quo_name(col_a), quo_name(col_b))
  df <- df %>% mutate(
    !!newvar := 
      c("No Match", "Match")[((!!col_a == '1') == (!!col_b == 'Yes')) + 1]
    )
  return(df)
}

暫無
暫無

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

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