簡體   English   中英

如何將變量名傳遞給 dplyr 的 group_by()

[英]How to pass a variable name to dplyr's group_by()

我可以使用以下代碼計算組name1中我的 dataframe df中值 ( val ) 的排名:

res  <- df %>% arrange(val) %>% group_by(name1) %>% mutate(RANK=row_number()) 

我不想在代碼中編寫列“name1”,而是想將其作為變量傳遞,例如crit = "name1" 但是,下面的代碼不起作用,因為crit1被假定為列名而不是變量名。

res  <- df %>% arrange(val) %>% group_by(crit1) %>% mutate(RANK=row_number()) 

如何在代碼中傳遞crit1

謝謝。

我們可以使用group_by_

library(dplyr)
df %>%
    arrange(val) %>% 
    group_by_(.dots=crit1) %>%
    mutate(RANK=row_number()) 
#Source: local data frame [10 x 4]
#Groups: name1, name2 [7]

#            val name1 name2  RANK
#          <dbl> <chr> <chr> <int>
#1  -0.848370044     b     c     1
#2  -0.583627199     a     a     1
#3  -0.545880758     a     a     2
#4  -0.466495124     b     b     1
#5   0.002311942     a     c     1
#6   0.266021979     c     a     1
#7   0.419623149     c     b     1
#8   0.444585270     a     c     2
#9   0.536585304     b     a     1
1#0  0.847460017     a     c     3

更新

group_by_在最近的版本中已被棄用(現在使用dplyr版本 - 0.8.1 ),因此我們可以使用group_by_at ,它將字符串向量作為輸入變量

df %>%
  arrange(val) %>% 
  group_by_at(crit1) %>%
  mutate(RANK=row_number())

或者另一種選擇是轉換為符號(來自rlang syms )並評估( !!!

df %>%
   arrange(val) %>% 
   group_by(!!! rlang::syms(crit1)) %>% 
   mutate(RANK = row_number())

數據

set.seed(24)
df <- data.frame(val = rnorm(10), name1= sample(letters[1:3], 10, replace=TRUE), 
         name2 = sample(letters[1:3], 10, replace=TRUE), 
 stringsAsFactors=FALSE)

crit1 <- c("name1", "name2")

使用 dplyr 1.0.0 更新

新的across語法消除了對!!! rlang::syms() !!! rlang::syms() 因此,您現在可以通過以下方式簡化代碼:

df %>%
   arrange(val) %>% 
   group_by(across(all_of(crit1))) %>% 
   mutate(RANK = row_number())

面對類似的任務,我可以成功地使用這兩個選項。

使用across()

for (crit in names(df)) {
  print(df |> 
          # all_of() is not needed here
          group_by(across(crit)) |> 
          count())
}

使用syms()!! :

crits = syms(names(df))

for (crit in crits) {
  print(df |> 
          # the use of !! instead of !!! is now encouraged 
          group_by(!!crit) |> 
          count())
}

暫無
暫無

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

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