【问题标题】:Reshape a dataframe from 1 x 4 to 2 x 2?将数据框从 1 x 4 重塑为 2 x 2?
【发布时间】:2021-09-29 13:14:47
【问题描述】:

我正在使用 dplyr 库,并在管道中创建了一个数据框,看起来像这样:

a <- c(1, 2, 2)
b <- c(3, 4, 4)
data <- data.frame(a, b)
data %>% summarize_all(c(min, max))

这给了我这个数据框:

a_fn1 b_fn1 a_fn2 b_fn2
    1     3     2     4

我正在尝试重塑这个数据框,以便管道的输出在几行中堆叠多列,如下所示:

A  B
----
1  3
2  4

我该怎么办?我不想更改函数的调用方式,因为 summarise_all 函数可以帮助我实现我正在寻找的值。我只想知道如何将此数据框更改为形状,以便每行中的每个值都是给定列的汇总函数的值。

【问题讨论】:

  • 你应该做一个可重现的例子,请阅读:stackoverflow.com/a/5963610/6574038
  • 谢谢。希望我所做的编辑使这个例子更具重现性。
  • 对不起,我还不清楚你的目标是什么。但是,要使用 tidyverse 重塑数据帧,请查看 tidyr::pivot_longertidyr::pivot_wider
  • Pivot longer 不会做我想要做的事情,因为它会将列名变成单行。我只想将汇总函数的结果堆叠到每个函数的单独行中,而不是包含函数所有输出的单行
  • 相关帖子,有dplyr/tidy解决方案,试试看:stackoverflow.com/q/46841179/680068

标签: r dplyr


【解决方案1】:

首先,在summarize_all() 中命名您的函数将使它们出现在结果中,以便于争论。

然后,您可以使用pivot_longer()names_to 中的特殊.value 哨兵来实现您想要的:

library(tidyverse)
a <- c(1, 2, 2)
b <- c(3, 4, 4)
data <- data.frame(a, b)
data %>% 
  summarize_all(c(min=min, max=max)) %>%
  pivot_longer(everything(), names_to=c(".value", "variable"), names_pattern="(.)_(.+)")
#> # A tibble: 2 x 3
#>   variable     a     b
#>   <chr>    <dbl> <dbl>
#> 1 min          1     3
#> 2 max          2     4

reprex package (v2.0.0) 于 2021-07-22 创建

根据您想要的输出,您甚至可以将顺序切换为c("variable", ".value")

请注意,summarize_all() 已被弃用,您可能希望使用新的、更详细的语法:summarize(across(everything(), c(min=min, max=max)))

【讨论】:

  • 实际上在我的真实示例中,我使用了 summarise_if,因为我需要谓词来运行我需要的函数。
  • @Anonymous 你应该查看?across 的帮助,它也可以处理谓词。
  • 注明。但是现在我总结的结果是正确的输出。然而,这个解决方案分解了我的列的名称并且没有给我一个解决方案,因为它为每个函数输出多行。
  • @Anonymous 此解决方案提供了您在问题中编写的预期输出(您可以删除额外的“变量”列)。如果这不是您想要的,您需要更好地解释它并给我们另一个预期的输出。这甚至可能属于另一个问题,我不确定。
猜你喜欢
  • 2019-02-03
  • 2019-11-16
  • 2019-08-21
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多