Группировать строки и столбцы данных на основе других данных? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть фрейм данных, который я хотел бы сгруппировать в обоих направлениях, сначала по часовой стрелке, а затем по столбцам. Первая часть работала хорошо, но я застрял со второй. Я был бы признателен за любую помощь или совет для решения, которое делает оба шага одновременно.

Это кадр данных:

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)

Группировка строк:

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

Теперь я хотел бы применить ту же группировку к столбцу ID2 и суммировать значения в других столбцах. Моя идея состояла в том, чтобы изменить другой столбец (например, «group», который содержит имя последней группы ID2. После этого я могу использовать group_by () и sumrize () для вычисления суммы для каждого. Однако я не могу придумать автоматизированный способ сделать это

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)

Это последняя таблица, которая мне нужна, но мне пришлось вручную назначать группы, что невозможно для больших наборов данных

1 Ответ

1 голос
/ 15 апреля 2020

Я предложу такое решение

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...