在R中使用至少三个共同变量对案例进行分组
我想通过多个变量对数据集进行分组,然后识别这些组。当我只使用带有group_索引的dplyr对一个变量进行分组时,我可以标识组。 但我想通过在某一组变量中至少有一个变量上具有相同的值来对案例进行分组,然后确定案例所属的组。如何在R中执行此操作 我有以下数据集在R中使用至少三个共同变量对案例进行分组,r,dplyr,R,Dplyr,我想通过多个变量对数据集进行分组,然后识别这些组。当我只使用带有group_索引的dplyr对一个变量进行分组时,我可以标识组。 但我想通过在某一组变量中至少有一个变量上具有相同的值来对案例进行分组,然后确定案例所属的组。如何在R中执行此操作 我有以下数据集 NPI name adress phone 1 1 1 1 2 1 1 1 3 2 2 2 4 2
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
在我的真实数据集中,我没有数字,只有姓名、实际地址和电话号码。所以我使用的所有变量都是字符串变量 用
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
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)
注意:
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
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)
即使姓名
、地址
和电话
都是字符,该功能也能正常工作。只要and id列(NPI
)是数字,那么最终的data.frame的顺序就正确
数据:
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
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)
为什么最后一个值是1?因为它与前两个案例共享名称。我们假设一个层次结构(看起来是隐含的)。如:名称>地址>组织?是的!虽然org不是案例分组所依据的三个变量的一部分,但org本身是分组变量,因此Name>Address>phone感谢用户的帮助,但我没有提到的是,我正在处理字符串变量,正因为如此,我无法对它们进行排序,所以当我将此方法应用于实际数据集时,它似乎不起作用。@BoazKaarsemaker您可以对字符串变量进行排序,只是排序与对数值变量进行排序时有所不同。因此,只要id列(
NPI
)是数字,我的解决方案就可以工作。即使不是这样,唯一会搞砸的就是最后一行的顺序。组
变量仍将正确创建。查看我的更新。请注意,下次如果您的原始列是字符,请不要将它们作为数字提供。当我使用您提供的代码时,会出现错误:排列中出错(.data,dots):位置1处的大小(1)不正确,期望值:2322我认为这可能是因为变量的名称也是字符串,并尝试使用s_dplyr解决这个问题,有人编写了一个使用字符串的代码,但我无法解决它。