簡體   English   中英

使用 R function 使用變量/列名稱作為 arguments 使用 mutate 和 case_when 創建新變量時出錯

[英]errors when using R function using variables/column names as arguments to create a new variable using mutate and case_when

R 中我遇到的一個問題是在函數中指定變量名。 我看過示例,有時使用 {{argument}} 或其他方法讓它們工作,但我真的不明白為什么有些事情有效而其他事情卻沒有。 例如,我剛剛嘗試制作一個 function,它將使用 2 個變量值來生成一個新變量。 下面的可重現示例:

look<-cars
twotoone<-function(v1,v2,nv){
  look<-look %>% mutate(nv=case_when(
    v1 > 4 & v2 > 4 ~ 1,
    TRUE ~ 0
  ))
  look<<-look
}
twotoone(speed,dist,allover4)

我得到一個錯誤:

錯誤: mutate()nv有問題。 i nv = case_when(v1 > 4 & v2 > 4 ~ 1, TRUE ~ 0) x object 未找到“速度”

如果我將所有 arguments 放在引號中:

twotoone('speed','dist','allover4')

沒有錯誤,但是 output 數據幀有新變量 nv 而不是 'allover4',它總是 =1(即使速度或距離之一低於 4 也不會分配 0)。 如果我只引用前兩個 arguments,也會出現同樣的結果:

twotoone('speed','dist',allover4)

任何幫助我理解如何擴展函數的使用以幫助重新編碼和復合變量的幫助,將不勝感激。 謝謝!!

我們可以使用{{}} - curly-curly 運算符,它對傳遞未引用的 arguments 進行非標准評估 - 以前它是用enquo + 完成的!! . 通常, =不能對 lhs 上的表達式求值,而 tidyverse 中的:=運算符可以做到,這就是我們使用:=的原因

twotoone<-function(dat, v1,v2,nv){
  dat %>%
    mutate({{nv}} := case_when(
    {{v1}} > 4 & {{v2}} > 4 ~ 1,
    TRUE ~ 0
  ))
}

-測試

twotoone(cars, speed,dist,allover4)
   speed dist allover4
1     4    2        0
2     4   10        0
3     7    4        0
4     7   22        1
5     8   16        1
6     9   10        1
...

這是帶有ensym!!的版本 :

twotoone<-function(df, v1,v2,nv){
  v1 <- rlang::ensym(v1)
  v2 <- rlang::ensym(v2)
  nv <- rlang::ensym(nv)
  
  df %>% 
    mutate(!!nv := case_when(
    !!v1 > 4 & !!v2 > 4 ~ 1,
    TRUE ~ 0
  ))
}
twotoone(cars, speed,dist,allover4)
   speed  dist allover4
   <dbl> <dbl>    <dbl>
 1     4     2        0
 2     4    10        0
 3     7     4        0
 4     7    22        1
 5     8    16        1
 6     9    10        1
 7    10    18        1
 8    10    26        1
 9    10    34        1
10    11    17        1
# ... with 40 more rows

暫無
暫無

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

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