Существует ли функция R, которая проверяет, совпадают ли все значения в группе со всеми значениями в другой группе?

Данные у меня есть:

А Б 1 а 2 с 2 е 3 ж 4 час 5 с 5 е

Что я хочу:

А Б Группа 1 а 1 2 с 2 2 е 2 3 ж 3 4 час 4 5 с 2 5 е 2

Код, который я попытался:

library(readxl)
library(dplyr)
library(stringr)
data1 <- read_excel("testing.xlsx")
data2 <- data1 %>% 
  group_by(A) %>% 
  group_by(B) %>% 
  mutate(Group = cur_group_id()) %>% 
  ungroup()

Что я получаю от этого кода:

А Б Группа 1 а 1 2 с 2 2 е 3 3 ж 4 4 час 5 5 с 2 5 е 3

Обновлено: я получаю сообщение об ошибке: «Невозможно предоставить «.by», если «.data» представляет собой сгруппированный фрейм данных». за все комментарии ниже. Исходные данные, которыми я манипулирую, были соединены слева, а затем сгруппированы. Как мне к этому подойти?

Можете ли вы объяснить, как вы пытаетесь сгруппироваться? Например, почему «2 c», «5 c» и «5 e» находятся в одной группе? Ваш второй group_by просто перезаписывает первый, поскольку аргументом по умолчанию является .add = FALSE.

LMc 01.05.2024 00:20

Абсолютно! Если все значения B в разных группах A совпадают, то они находятся в одной группе. В этом случае все значения B (c и e) совпадают для 2 и 5. Надеюсь, это имеет смысл.

user15290979 01.05.2024 00:24

Хорошо! Я попробую.

user15290979 01.05.2024 01:11

Попробовал обновить, но похоже, что он уже актуален.

user15290979 01.05.2024 01:12

вам следует использовать .by = в исходном несгруппированном кадре данных, т. е. data1

ThomasIsCoding 01.05.2024 01:14

Можно ли использовать предоставленный вами код в сгруппированном наборе? Несгруппированный фрейм данных — это не те данные, которые я хотел сгруппировать.

user15290979 01.05.2024 01:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
6
126
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете попробовать ниже

library(dplyr)
df %>%
    left_join(
        (.) %>%
            summarise(group = as.factor(toString(sort(B))), .by = A) %>%
            mutate(group = as.integer(group))
    )

или вы можете дополнительно использовать membership из пакета igraph

library(dplyr)
library(igraph)
df %>%
    mutate(group = {
        (.) %>%
            graph_from_data_frame() %>%
            components() %>%
            membership()
    }[B])

который дает

  A B group
1 1 a     1
2 2 c     2
3 2 e     2
4 3 f     3
5 4 h     4
6 5 c     2
7 5 e     2

бонус (за проценты igraph)

df %>%
    graph_from_data_frame() %>%
    plot()

показывает группы

Что делает left_join((.) %>% ...)?

Azor Ahai -him- 01.05.2024 00:48

@AzorAhai-him- позвольте df левой кнопкой мыши присоединиться к суммарному групповому кадру данных.

ThomasIsCoding 01.05.2024 00:53

О, я понимаю, это, вероятно, могло бы иметь какое-то объяснение.

Azor Ahai -him- 01.05.2024 03:10
library(dplyr)

data1 |>
  mutate(group = paste(sort(B), collapse = ""), .by = A) |>
  mutate(group = cur_group_id(), .by = group)

Выход

  A B group
1 1 a     1
2 2 c     2
3 2 e     2
4 3 f     3
5 4 h     4
6 5 c     2
7 5 e     2

Была такая же идея, но потом понял, что она работает только в том случае, если A упорядочена и представляет собой просто числа 1:n. В противном случае это потерпит неудачу, поскольку не принимает во внимание значения A.

Onyambu 01.05.2024 00:41

@Onyambu, можешь привести пример? Например, он все еще работает с этим фреймом данных (где A не упорядочен, а не просто числа). structure(list(A = c("1", "5A", "5A", "3", "4", "2B", "2B"), B = c("a", "c", "e", "f", "h", "c", "e")), class = "data.frame", row.names = c(NA, -7L))

LMc 01.05.2024 00:45

Ваш пример явно возвращает 1,2,2,3,4,2,2 вместо 1,5A,5A,3,4,5A,5A

Onyambu 01.05.2024 00:58

@Onyambu да, потому что это явно то, чего хочет ОП. Если они хотят вернуть исходные группы, они могут это сделать A[cur_group_id()], но я не думаю, что они этого ищут.

LMc 01.05.2024 01:30

На самом деле A[cur_group_id()] не сработает

LMc 01.05.2024 02:11

Ох, я понимаю, что ты имеешь в виду. Я думал, что OP хотел группировать, как указано буквой A, из-за их комментариев к решению Thomasiscoding.

Onyambu 01.05.2024 06:50
 df %>%
   mutate(group = toString(B), .by=A)%>%
   mutate(group = A[match(group, group)], .by=group)

  A B group
1 1 a     1
2 2 c     2
3 2 e     2
4 3 f     3
5 4 h     4
6 5 c     2
7 5 e     2

Вы можете сделать это:

setDT(df)[df[, .(B=paste0(sort(B), collapse = "")),A][, Group:=min(A), B], on = "A", .(A, B, Group)]

Выход:

       A      B Group
   <int> <char> <int>
1:     1      a     1
2:     2      c     2
3:     2      e     2
4:     3      f     3
5:     4      h     4
6:     5      c     2
7:     5      e     2

Но, как отмечали другие, это работает только потому, что B можно легко отсортировать и склеить, а A является числовым.

Другие вопросы по теме