使用group_by循环多个变量以获取多个结果

xt0899hw  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(113)

对于下面描述的数据,我尝试使用基于两个变量(MUNICIPIO和一个正在循环的动态变量)的group by函数来汇总值。

df <- data.frame(
  department = c(rep("5", 18)),
  municipio = c(rep("501", 6), rep("502", 6), rep("503", 6)),
  area = c(rep("1", 9), rep("2", 9) ),
  pcp6 = c(rep("1", 10), rep("2", 8) ),
  pcp9 = c(rep("1", 3), rep("2", 1), rep("9", 2 ), rep("1", 1), rep("2", 3), rep("9", 2 ), 
           rep("1", 2), rep("2", 1), rep("9", 3 ))
)

我使用下面的代码来获得结果,但是每个动态变量都有一个不同的唯一汇总计数:

vars <- colnames(df)
vars <- vars[-which(vars == "department")]

Outlier_check <- vector("list", length(vars))

for (i in seq_along(vars)) {
    Outlier_check[[i]] <- df %>%
    group_by(municipio, vars[[i]]) %>%
    summarise(length(which(!is.na(vars[[i]]))))
}

我正在寻找的结果是下面,但是,它是从501 - 512 municipio范围:
| 市政|多氯联苯9|长度(pcp 9)|
| - ------|- ------|- ------|
| 小行星501|1个|三个|
| 小行星501|第二章|1个|
| 小行星501|九|第二章|
| 小行星502|1个|1个|
| 小行星502|第二章|三个|
| 小行星502|九|第二章|
| 五零三|1个|第二章|
| 五零三|第二章|1个|
| 五零三|九|三个|
| 市政|五氯酚6|长度(pcp 6)|
| - ------|- ------|- ------|
| 小行星501|1个|六个|
| 小行星502|1个|四个|
| 小行星502|第二章|第二章|
| 五零三|第二章|六个|
我有两个问题:
1.如何让循环变量通过处理并计算出所需的摘要?
1.如何保存不同的汇总结构集,以便在可能的一个数据结构中提取?
原始数据中大约有7,77,000行。
我已经看过很多关于堆栈溢出的参考资料,但还没有找到解决方案。
谢谢大家!

bn31dyow

bn31dyow1#

您的解决方案存在一些问题:
1.您正在使用字符向量来调用列。在tidyverse中,您应该简单地通过名称来调用对象,而不使用引号。这称为tidyeval。您也可以使用!!sym--这将字符向量转换为列名或符号,然后使用!!获取列。
1.您试图在一种情况下按municipio分组两次。在迭代之前,需要将其从列名列表中删除。
1.不用复杂的summarise语句,我们可以简单地使用dplyr::count对项目进行分组并计算出现的次数。
下面是可以工作的代码:

library(dplyr)

vars <- colnames(df)
vars <- vars[-which(vars %in% c("department", "municipio")]

Outlier_check <- vector("list", length(vars))

for (i in seq_along(vars)) {
  Outlier_check[[i]] <- df %>%
    count(municipio, !!sym(vars[[i]]))
}

输出为:

Outlier_check
#> [[1]]
#>   municipio area n
#> 1       501    1 6
#> 2       502    1 3
#> 3       502    2 3
#> 4       503    2 6
#> 
#> [[2]]
#>   municipio pcp6 n
#> 1       501    1 6
#> 2       502    1 4
#> 3       502    2 2
#> 4       503    2 6
#> 
#> [[3]]
#>   municipio pcp9 n
#> 1       501    1 3
#> 2       501    2 1
#> 3       501    9 2
#> 4       502    1 1
#> 5       502    2 3
#> 6       502    9 2
#> 7       503    1 2
#> 8       503    2 1
#> 9       503    9 3

相关问题