如何聚合pivot_wider生成的数据框中相同分组的行数据?
解决pivot_wider后同一分组多行合并为单行的问题
你当前的情况是:执行pivot_wider转换数据后,同一分组(CODE_C、CODE_P、LIB_COMPOSANT、LIB_PRODUIT完全一致)的数据被拆成多行,每个日期列仅一个位置有有效值、其余都是NA,需要将这些行合并为单行,保留所有日期的有效值。
方法1:在pivot_wider中直接指定聚合规则
初始的pivot_wider代码未设置values_fn参数,导致同一分组对应多个值时(这里是每个日期单独占一行),默认拆分为多行。只需添加values_fn = ~na.omit(.),让函数自动提取每个分组下的非NA值即可:
library(tidyr) # 基于原始数据DONNEES_COMPOSANT执行转换 pivot_wider(DONNEES_COMPOSANT, names_from = date, values_from = PRIX, values_fn = ~na.omit(.))
方法2:对已生成的宽表进行聚合
如果已经得到了包含多行的宽表(示例中命名为wide_df),可以用dplyr按分组列聚合,对每个日期列提取非NA值:
library(dplyr) # 加载可复现的宽表数据 wide_df <- structure(list(CODE_C = c("FABR**01", "FABR**01", "FABR**01", "FABR**01", "FABR**01", "FABR**01"), CODE_P = c("FABR**", "FABR**", "FABR**", "FABR**", "FABR**", "FABR**"), LIB_COMPOSANT = c("Abricot, 82", "Abricot, 82", "Abricot, 82", "Abricot, 82", "Abricot, 82", "Abricot, 82" ), LIB_PRODUIT = c("Abricot", "Abricot", "Abricot", "Abricot", "Abricot", "Abricot"), `2020-01-01` = c(1.32446153846154, NA, NA, NA, NA, NA), `2020-02-01` = c(NA, 1.09984615384615, NA, NA, NA, NA), `2020-03-01` = c(NA, NA, 3.33157894736842, NA, NA, NA ), `2020-04-01` = c(NA, NA, NA, 4.70916279069767, NA, NA), `2020-05-01` = c(NA, NA, NA, NA, 4.37848648648649, NA), `2020-06-01` = c(NA, NA, NA, NA, NA, 3.24713953488372)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 聚合合并行 wide_df %>% group_by(CODE_C, CODE_P, LIB_COMPOSANT, LIB_PRODUIT) %>% summarise(across(everything(), ~na.omit(.)), .groups = "drop")
预期输出
执行任意一种方法后,会得到如下结果:
# A tibble: 1 × 10 CODE_C CODE_P LIB_COMPOSANT LIB_PRODUIT `2020-01-01` `2020-02-01` `2020-03-01` `2020-04-01` `2020-05-01` `2020-06-01` <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 FABR**01 FABR** Abricot, 82 Abricot 1.32 1.10 3.33 4.71 4.38 3.25
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

