[英]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")
新的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.