在 R 中的函数内转置数据帧

transposing a dataframe inside a fuction in R

我有一个非常大的 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 and 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)

以 2000 年为例,这是一个生成您想要的结构的解决方案:

slice <- function (d, y, a, b){
       c2 <- filter(d, year %in% c(y)) %>% 
         group_by({{a}}, {{b}}) %>%
         summarise(count = n()) %>% 
         pivot_wider(names_from = {{b}}, values_from = count)
}

df <- slice(d, 2000, header_1, header_2)