【发布时间】:2019-03-27 04:48:36
【问题描述】:
如何将函数应用于分组行的多列?例如;
library(tidyverse)
data <- tribble(
~Date, ~Seq1, ~Component, ~Seq2, ~X1, ~X2, ~X3,
"01/01/18", 1, "Smooth", NA, 3.98, 2.75, 1.82,
"01/01/18", 2, "Smooth", NA, 1.02, 0.02, -0.04,
"01/01/18", 3, "Smooth", NA, 3.48, 3.06, 1.25,
"01/01/18", 3, "Bounce", 1, 2.01, -0.43, -0.52,
"01/01/18", 3, "Bounce", 2, 1.94, 1.53, 1.92) %>%
mutate_at(vars(Date, Seq1, Component, Seq2), funs(factor))
X 值的每一列(更多列,为清楚起见此处截断)被分组为 Date、Seq1、Component 和 Seq2。虽然 Component "Smooth" 和 Seq1 "NA" 是恒定的,但在 Component "Bounce" 级别内有多个 Seq2 级别,例如“1”、“2”等
如何对每个 X 列求和,Seq2 的每个级别始终为常数“NA”?
想要的结果是:
expected <- tribble(
~Date, ~Seq1, ~Component, ~Seq2, ~X1, ~X2, ~X3,
"01/01/18", 1, "Smooth", NA, 3.98, 2.75, 1.82,
"01/01/18", 2, "Smooth", NA, 1.02, 0.02, -0.04,
"01/01/18", 3, "Smooth", NA, 3.48, 3.06, 1.25,
"01/01/18", 3, "Bounce", 1, 5.49, 3.49, 1.77,
"01/01/18", 3, "Bounce", 2, 5.42, 4.59, 3.17)
以下示例仅添加每个 Seq1 级别。
data %>%
group_by(Date, Seq1) %>%
mutate_at(vars(starts_with("X")), funs(sum(.)))
#> # A tibble: 5 x 7
#> # Groups: Date, Seq1 [3]
#> Date Seq1 Component Seq2 X1 X2 X3
#> <fct> <fct> <fct> <fct> <dbl> <dbl> <dbl>
#> 1 01/01/18 1 Smooth <NA> 3.98 2.75 1.82
#> 2 01/01/18 2 Smooth <NA> 1.02 0.02 -0.04
#> 3 01/01/18 3 Smooth <NA> 7.43 4.16 2.65
#> 4 01/01/18 3 Bounce 1 7.43 4.16 2.65
#> 5 01/01/18 3 Bounce 2 7.43 4.16 2.65
我确信purrr 或apply 函数系列中存在解决方案,但是,我在解决这个示例时(好几天)一直没有成功。实际数据有大约 180 个 X 列,有数百个 Date 和 Seq1 组合,以及多个 Seq2 级别。
类似的例子可能是Summing Multiple Groups of Columns、How to apply a function to a subset of columns in r?,甚至可能是https://github.com/jennybc/row-oriented-workflows。
由reprex package (v0.2.1) 于 2018 年 10 月 23 日创建
【问题讨论】:
-
您能否从这些数据中提供您预期的输出?我不明白“如何对每个 X 列求和,Seq2 的每个级别始终为常数“NA”?”方法。为什么你的尝试不正确?
-
或许
data %>% mutate(Sum = rowSums(.[grep("^X\\d+", names(.))])) -
我的尝试不正确,因为它仅在 Seq1 级别对每一列求和,例如X1 行 3-5 是一样的,而不是在想要的结果中。
-
我还不清楚你是如何到达
5.49, 3.49, 1.77和5.42, 4.59, 3.17的 -
@deann 它是通过[行,列]:
[3, X1] + [4, X1], [3, X2] + [4, X2], [3, X3] + [4, X3]和[3, X1] + [5, X1], [3, X2] + [5, X2], [3, X3] + [5, X3]。请注意,对于每个 X 列,始终将 Component == "smooth" 添加到每个 Component == "Bounce" 中。也就是说,当有一个 Bounce 组件(Seq2 中的每个序列)时,添加 Smooth 组件。后面会用X1、X2、X3等来绘制一系列的线。