[英]Correct column label in conditional dplyr group_by
我可以在dplyr group_by中使用条件语句来更改基于另一个变量进行分组的字段。 这是一个关于starwars
的简单例子:
library(dplyr)
my_val <- "Droid"
starwars %>%
group_by(if(my_val == "Human") {eye_color}
else if (my_val == "Droid") {homeworld}) %>%
summarize(mass = sum(mass))
但是, if (my_val == "Human") {\\n eye_color\\n} else if (my_val == "Droid") {\\n homeworld\\n}
的列名称是条件语句的字符串: if (my_val == "Human") {\\n eye_color\\n} else if (my_val == "Droid") {\\n homeworld\\n}
我可以在条件之前输入一个列名:
group_by(Character_Type = if(my_val == "Human") {eye_color}
else if (my_val == "Droid") {homeworld}) %>%
但是我希望列名与条件语句中选择的列匹配,在此示例中为eye_color
或homeworld
。
如何将列名设置为与在条件语句中选择的字段相同? 我可以将条件语句从dplyr语句中拉出,但是将其保留在其中会更简单。
像这样?
library(dplyr)
my_val <- "Droid"
starwars %>%
group_by(!!rlang::sym(ifelse(my_val == "Human","eye_color","homeworld"))) %>%
summarize(mass = sum(mass))
# A tibble: 49 x 2
homeworld mass
<chr> <dbl>
1 Alderaan NA
2 Aleen Minor 15
3 Bespin 79
4 Bestine IV 110
5 Cato Neimoidia 90
6 Cerea 82
7 Champala NA
8 Chandrila NA
9 Concord Dawn 79
10 Corellia 157
# ... with 39 more rows
要么
starwars %>%
group_by(!!rlang::sym(case_when(my_val=="Droid"~"homeworld",
my_val=="Human"~"eye_color"))) %>%
summarize(mass = sum(mass))
我们可以使用group_by_at
,它可以将字符串作为输入
library(dplyr)
starwars %>%
group_by_at(if_else(my_val == "Human", "eye_color", "homeworld")) %>%
summarise(mass = sum(mass))
# A tibble: 49 x 2
# homeworld mass
# <chr> <dbl>
# 1 Alderaan NA
# 2 Aleen Minor 15
# 3 Bespin 79
# 4 Bestine IV 110
# 5 Cato Neimoidia 90
# 6 Cerea 82
# 7 Champala NA
# 8 Chandrila NA
# 9 Concord Dawn 79
#10 Corellia 157
# ... with 39 more rows
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.