在 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函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)

pandas笔记:根据列索引名称/行索引名称 对列重新排序