【发布时间】:2021-07-27 20:03:39
【问题描述】:
我有一个非常大的 df,需要对其进行过滤、分组、汇总和重新排列,以便由不同的程序进行进一步处理。我可以一次完成一行代码,但我需要概括一下。起始数据框的格式如下:
| uniqueID | year | header_1 | header_2 | m | n | etc. |
|---|---|---|---|---|---|---|
| 0001 | 1990 | x | TRUE | |||
| 0002 | 1990 | y | FALSE | other data | ||
| 0003 | 1995 | x | FALSE |
最终结果应该是这样的,对于 df d 中的单个年份 y,其中 a = header_1 和 b = header_2:
| header_1 | TRUE | FALSE |
|---|---|---|
| x | count(x) | count(x) |
| y | count(y) | count(y) |
| z | count(z) | count(z) |
slice <- function (d,y,a,b) {
t <- filter(d, year %in% c(y))
c1 <- group_by(t, {{a}}, {{b}}) %>%
summarise(count = n())
c2 <- c1 %>% pivot_wider(names_from = {{a}}, values_from = count)
h <- c2$a
c3 <- as.data.frame(t(c2[,-1]))
colnames(c3) <- h
}
我收到错误消息:无法转换具有重复名称的数据框。另外:警告信息:
未知或未初始化的列:a。
同样,如果我明确命名对象,我不确定为什么这会起作用,但如果我尝试替换变量则会中断。 我有点理解第 6 行的未初始化列“a”,我尝试以多种方式应用双花括号(包括所有第 6 到 8 行),但我必须将它们放在错误的位置。还尝试插入显式语句来命名行,如下所示:
c3$name <- factor(row.names(c2))
但似乎无法在转置错误上取得进展。欣赏任何可以散发的光芒。
编辑添加示例数据:
id <- c("001", "002", "003", "004", "005", "006", "007")
year <- c(1990, 1990, 1995, 2000, 1995, 2000, 2000)
header_1 <- c(x, y, x, z, y, z, x)
header_2 <- c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE)
d <- data.frame(id, year, header_1, header_2)
【问题讨论】:
-
您能否提供一些适当格式的示例数据?
-
当然,添加了示例数据
-
首先您应该将
h <- c2$a替换为h <- select(c2, {{a}}),否则您无法访问函数内的变量a。但是,根据您的示例数据,在此处选择a是没有意义的,因为在您的处理步骤之后它不会出现在 df 中。如果此时将a替换为b,您将收到一个输出,尽管这不是您所期望的结果。因此,您需要调整处理步骤。 -
这很有帮助,谢谢。但是,恐怕我不明白最终 df 中没有“a”的意义。我按“a”分组,“a”是最终 df (a = header_1) 中索引列的名称。
标签: r function dataframe dplyr tidyr