对于下面描述的数据,我尝试使用基于两个变量(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行。
我已经看过很多关于堆栈溢出的参考资料,但还没有找到解决方案。
谢谢大家!
1条答案
按热度按时间bn31dyow1#
您的解决方案存在一些问题:
1.您正在使用字符向量来调用列。在
tidyverse
中,您应该简单地通过名称来调用对象,而不使用引号。这称为tidyeval
。您也可以使用!!sym
--这将字符向量转换为列名或符号,然后使用!!
获取列。1.您试图在一种情况下按
municipio
分组两次。在迭代之前,需要将其从列名列表中删除。1.不用复杂的
summarise
语句,我们可以简单地使用dplyr::count
对项目进行分组并计算出现的次数。下面是可以工作的代码:
输出为: