【问题标题】:Grouping cases with at least three variables in common in R在R中对具有至少三个共同变量的案例进行分组
【发布时间】:2017-10-11 18:34:05
【问题描述】:

我想按多个变量对我的数据集进行分组,而不是对这些组进行标识。当我使用 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
  • 因为它与前两种情况同名
  • 我们可以假设一个层次结构(看起来是隐含的)。如:名称 > 地址 > 组织?
  • 是的!尽管 org 不是应该对案例进行分组的三个变量的一部分,但 org 本身就是分组变量,因此 Name>Address>phone

标签: r dplyr


【解决方案1】:

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)

【讨论】:

  • 感谢用户对我的帮助,但我没有提到的是我正在使用字符串变量,因此我无法安排它们,所以这种方法似乎不起作用当我将它应用到我的实际数据集时。
  • @BoazKaarsemaker 您可以排列字符串变量,只是排列顺序与排列数字变量时不同。因此,只要您的 id 列 (NPI) 是数字,我的解决方案就可以工作。即使不是,唯一会搞砸的是最后几行的顺序。 group 变量仍将正确创建。查看我的更新。旁注,下次如果您的原始列是字符,请不要将它们提供为数字。
  • 当我使用您提供的代码时,我收到错误:arrange_impl(.data, dots) 中的错误:位置 1 的大小不正确 (1),预期:2322 我认为这可能是由于变量的名称也是字符串,并尝试使用 s_dplyr 解决此问题,这是有人使用字符串制作的代码,但我无法解决。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2021-09-26
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多