【问题标题】:transposing a dataframe inside a fuction in R在R中的函数内转置数据框
【发布时间】: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 &lt;- c2$a 替换为h &lt;- select(c2, {{a}}),否则您无法访问函数内的变量a。但是,根据您的示例数据,在此处选择 a 是没有意义的,因为在您的处理步骤之后它不会出现在 df 中。如果此时将a 替换为b,您将收到一个输出,尽管这不是您所期望的结果。因此,您需要调整处理步骤。
  • 这很有帮助,谢谢。但是,恐怕我不明白最终 df 中没有“a”的意义。我按“a”分组,“a”是最终 df (a = header_1) 中索引列的名称。

标签: r function dataframe dplyr tidyr


【解决方案1】:

以 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)  

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2017-05-04
    • 1970-01-01
    • 2017-02-07
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多