首页 > 解决方案 > 根据其他数据框对数据框行和列进行分组?

问题描述

我有一个数据框,我想在两个方向上进行分组,首先是按行排列,然后是按列排列。第一部分效果很好,但我坚持使用第二部分。对于同时执行这两个步骤的解决方案,我将不胜感激。

这是数据框:

df1 <- data.frame(
  ID = c(rep(1,5),rep(2,5)),
  ID2 = rep(c("A","B","C","D","E"),2),
  A = rnorm(10,20,1),
  B = rnorm(10,50,1),
  C = rnorm(10,10,1),
  D = rnorm(10,15,1),
  E = rnorm(10,5,1)
)

这是第二个数据帧,它包含分组的“配方”:

df2 <- data.frame (
  Group_1 = c("B","C"),
  Group_2 = c("D","A"),
  Group_3 = ("E"), stringsAsFactors = FALSE)

Rowise 分组:

df1_grouped<-bind_cols(df1[1:2], map_df(df2, ~rowSums(df1[unique(.x)]))) 

现在我想对 ID2 列应用相同的分组并对其他列中的值求和。我的想法是改变另一列(例如“组”,其中包含 ID2 的最终组的名称。在此之后,我可以使用 group_by() 和 summarise() 来计算每个列的总和。但是,我不能找出一种自动化的方法来做到这一点

bind_cols(df1_grouped,

    #add group label
    data.frame(
    group = rep(c("Group_2","Group_1","Group_1","Group_2","Group_3"),2))) %>%

    #remove temporary label column and make ID a character column
    mutate(ID2=group,
           ID=as.character(ID))%>%
    select(-group) %>%

    #summarise
    group_by(ID,ID2)%>%
    summarise_if(is.numeric, sum, na.rm = TRUE)

这是我需要的最终表,但我必须手动分配组,这对于大数据集是不可能的

标签: rdplyrpurrr

解决方案


我会提供这样的解决方案

library(tidyverse)
set.seed(1)
df1 <- data.frame(
  ID = c(rep(1,5),rep(2,5)),
  ID2 = rep(c("A","B","C","D","E"),2),
  A = rnorm(10,20,1),
  B = rnorm(10,50,1),
  C = rnorm(10,10,1),
  D = rnorm(10,15,1),
  E = rnorm(10,5,1)
)

df2 <- data.frame (
  Group_1 = c("B","C"),
  Group_2 = c("D","A"),
  Group_3 = ("E"), stringsAsFactors = FALSE) 

df2 <- df2 %>% pivot_longer(everything())

df1 %>% 
  pivot_longer(-c(ID, ID2)) %>% 
  mutate(gr_r = df2$name[match(ID2, table = df2$value)],
         gr_c = df2$name[match(name, table = df2$value)]) %>% 
  arrange(ID, gr_r, gr_c) %>% 
  pivot_wider(c(ID, gr_r), names_from = gr_c, values_from = value, values_fn = list(value = sum))

推荐阅读