Tom*_*ood 6 variables group-by r dplyr
我可以使用以下代码在组name1中的数据帧df中计算值(val)的排名:
res <- df %>% arrange(val) %>% group_by(name1) %>% mutate(RANK=row_number())
Run Code Online (Sandbox Code Playgroud)
我不想在代码中编写“ name1”列,而是将其作为变量传递,例如crit =“ name1”。但是,由于假定crit1是列名而不是变量名,所以下面的代码不起作用。
res <- df %>% arrange(val) %>% group_by(crit1) %>% mutate(RANK=row_number())
Run Code Online (Sandbox Code Playgroud)
如何在代码中传递crit1?
谢谢汤姆
akr*_*run 12
我们可以用 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
Run Code Online (Sandbox Code Playgroud)
group_by_在最新版本中已弃用(现在使用dplyrversion- 0.8.1),因此我们可以使用group_by_at将字符串向量作为输入变量的形式
df %>%
arrange(val) %>%
group_by_at(crit1) %>%
mutate(RANK=row_number())
Run Code Online (Sandbox Code Playgroud)
或另一种选择是转换为符号(symsfrom rlang)并求值(!!!)
df %>%
arrange(val) %>%
group_by(!!! rlang::syms(crit1)) %>%
mutate(RANK = row_number())
Run Code Online (Sandbox Code Playgroud)
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")
Run Code Online (Sandbox Code Playgroud)
新across语法消除了对!!! rlang::syms(). 因此,您现在可以通过以下方式简化代码:
df %>%
arrange(val) %>%
group_by(across(all_of(crit1))) %>%
mutate(RANK = row_number())
Run Code Online (Sandbox Code Playgroud)