在 group_by 中使用列索引而不是名称
Posted
技术标签:
【中文标题】在 group_by 中使用列索引而不是名称【英文标题】:Use column index instead of name in group_by 【发布时间】:2018-03-08 06:29:48 【问题描述】:我想用 dplyr 总结一个数据框,像这样:
> test <-data.frame(ID = c("A", "A", "B", "B"), val = c(1:4))
> test %>% group_by(ID) %>% summarize(av = mean(val))
# A tibble: 2 x 2
ID av
<fctr> <dbl>
1 A 1.5
2 B 3.5
但是假设我不想按名为“ID”的列进行分组,而是希望按第一列进行分组,而不管其名称如何。有没有简单的方法来做到这一点?
我尝试了一些天真的方法(group_by(1)
、group_by(.[1])
、group_by(., .[1])
、group_by(names(.)[1])
无济于事。我才刚刚开始使用 tidyverse 包,所以我可能会遗漏一些明显的东西。
This question 非常相似,但它是关于变异的,我无法将其概括为我的问题。 This question 也类似,但公认的答案是使用不同的包,我正在尝试坚持使用 dplyr。
【问题讨论】:
【参考方案1】:您可以为此使用 scoped 变体之一 (group_by_at
):
test %>% group_by_at(1) %>% summarise(av = mean(val))
# A tibble: 2 x 2
# ID av
# <fctr> <dbl>
#1 A 1.5
#2 B 3.5
【讨论】:
【参考方案2】:您可以使用across
版本1.0.0
起的功能:
library(dplyr)
test %>%
group_by(across(1)) %>%
summarise(av = mean(val))
## A tibble: 2 x 2
# ID av
# <fct> <dbl>
#1 A 1.5
#2 B 3.5
【讨论】:
【参考方案3】:在旧版本的dpylyr
中,您可以使用dplyr::group_by_
的标准评估:
test %>%
group_by_(names(.)[1]) %>%
summarize(av = mean(val))
## A tibble: 2 x 2
# ID av
# <fctr> <dbl>
#1 A 1.5
#2 B 3.5
【讨论】:
标准评估现在是deprecated。【参考方案4】:如果我们需要使用NSE,那么可以使用sym
和!!
test %>%
group_by(!! rlang::sym(names(.)[1])) %>%
summarise(av = mean(val))
# A tibble: 2 x 2
# ID av
# <fctr> <dbl>
#1 A 1.5
#2 B 3.5
我们也可以创建一个函数。如果我们传递带引号的字符串,那么我们使用 sym
和 !!
或者使用 enquo/!!
路由
f1 <- function(dat, grp, valueCol)
dat %>%
group_by(!! rlang::sym(grp)) %>%
summarise(av = mean(!! rlang::sym(valueCol)))
f1(test, "ID", "val")
# A tibble: 2 x 2
# ID av
# <fctr> <dbl>
#1 A 1.5
#2 B 3.5
【讨论】:
这比我实际需要的问题要复杂,但它让我走上了一条关于评估和programming with dplyr 的富有成效的学习之路以上是关于在 group_by 中使用列索引而不是名称的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用read_csv函数读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用方括号[]基于最外层列索引名称索引列数据
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用方括号[]基于列索引名称元组索引列数据(index tuple)
pandas使用read_csv函数读取csv数据columns.get_level_values属性查看数据集的列索引中指定层级的索引内容(使用索引位置或者名称)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)
pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)