已关闭:是否有 R 函数可以检查一组中的所有值是否与另一组中的所有值相同?

问题描述 投票:0回答:4

我拥有的数据:

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

我想要什么:

A B 团体
1 a 1
2 c 2
2 e 2
3 f 3
4 h 4
5 c 2
5 e 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()

我从这段代码中得到什么:

A B 团体
1 a 1
2 c 2
2 e 3
3 f 4
4 h 5
5 c 2
5 e 3

编辑: 我收到错误 - “当‘.data’是分组数据框时,无法提供‘.by’。”对于下面的所有评论。我正在操作的原始数据已左连接,然后分组。我该如何处理这个问题?

r group mutate
4个回答
7
投票

您可以尝试以下

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()

显示组 enter image description here


3
投票
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

3
投票

你可以这样做:

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 是数字。


2
投票
 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
© www.soinside.com 2019 - 2024. All rights reserved.