在R中对具有至少三个共同变量的案例进行分组

时间:2017-10-11 18:34:06

标签: r dplyr

我想要通过多个变量对数据集进行分组,而不是对这些组进行分配。当我只使用dplyr和group_indices将一个变量分组时,我可以识别组。 但我想通过在一组特定变量中的至少一个上具有相同的值来对案例进行分组,然后识别属于的组案例。如何在R?中做到这一点?

我有以下数据集

    NPI name adress phone   
    1    1    1      1          
    2    1    1      1
    3    2    2      2
    4    2    3      3
    5    3    4      4
    6    3    4      5
    7    4    5      6
    8    5    6      6
    9    6    7      7
    10   7    8      8
    11   1    9      9      

我希望案例在他们至少有一个我所列出的三个变量(名称,地址,电话号码)的情况下进行分组。 彼此最常见的案例应分组在共同点最少的案例中。 所以我想创建一个分组变量,如果它们在同一个组中,它们会给出相同的值。 您可以采用名称>地址>电话

的层次结构
    NPI name adress phone  org  
    1    1    1      1      1       
    2    1    1      1      1
    3    2    2      2      2
    4    2    3      3      2
    5    3    4      4      3
    6    3    4      5      3
    7    4    5      6      4
    8    5    6      6      4 
    9    6    7      7      5
    10   7    8      8      6
    11   1    9      9      1

在我的真实数据集中,我没有数字,但有姓名,实际地址和电话号码。所以我正在使用的所有变量都是字符串变量。

1 个答案:

答案 0 :(得分:0)

使用dplyr

尝试此操作
library(dplyr)

df %>%
  arrange(name, adress, phone) %>%
  mutate(group = c(1, ifelse((name != lag(name)) & (adress != lag(adress)) & (phone != lag(phone)), 1, 0)[-1]),
         group = cumsum(group)) %>%
  arrange(NPI)

<强>结果:

   NPI name adress phone group
1    1    1      1     1     1
2    2    1      1     1     1
3    3    2      2     2     2
4    4    2      3     3     2
5    5    3      4     4     3
6    6    3      4     5     3
7    7    4      5     6     4
8    8    5      6     6     4
9    9    6      7     7     5
10  10    7      8     8     6
11  11    1      9     9     1

注意:

即使nameadressphone都是字符,这也有效。只要和id列(NPI)是数字,最终的data.frame将按正确的顺序排列。

数据:

df = read.table(text = "   NPI name adress phone   
                1    1    1      1          
                2    1    1      1
                3    2    2      2
                4    2    3      3
                5    3    4      4
                6    3    4      5
                7    4    5      6
                8    5    6      6
                9    6    7      7
                10   7    8      8
                11   1    9      9 ", header = TRUE)

library(dplyr)
df = df %>% mutate_at(vars(-NPI), as.character)