我希望基于地址和地块所有权将个人分组到不同的家庭中。如果人们住在相同的地址并且直接或间接拥有至少一个地块的所有权,则他们属于同一户人家。
个人之间的链接可以是直接的,即两个人共享一个地块,但链接也可以是间接的,通过交叉连成链 - 两个人共享一个地块,并且其中一个人与其他人之一也共享一个地块,并且所有人都住在同一地址。
以下是一些例子:
- 如果一个人(9)独自居住在他的地址(C),即使另一个人(6)也拥有他或她的地块(s),他也会独自拥有家庭。
- 如果两个人(12和13)住在同一地址(F)并拥有相同的地块(w),则他们属于同一户人家。但是,如果三个人住在同一地址(B),但只有两个人(7和8)拥有相同的地块(r),第三个人(6)住在这个地址(B)但拥有另一个地块(m),那么只有拥有相同地块的两个人来自同一户人家。
- 如果在同一地址(A),有4个人住(1、2、3和4),如果人们(1、2和3)通过拥有几个地块(m、n和o)相连,则他们属于同一户人家,而同时也住在这个地址的人(4)没有拥有这3个地块之一而是另一个(p)的所有权,因此不属于同一户人家。
我有三个变量:地址ID、所有者ID和地块ID。我想得到一个家庭号。以下是一个示例表格:
id_address id_owner id_parcel id_household
A 1 m 1
A 1 n 1
A 2 n 1
A 2 o 1
A 3 o 1
A 4 p 2
A 5 q 3
B 6 s 4
B 7 r 5
B 8 r 5
C 9 s 6
D 10 t 7
E 11 u 8
E 11 v 8
F 12 w 9
F 13 w 9
我的第一反应是循环,但是我有 800,000 行数据,这可能会花费太长时间。
以下是示例数据,其中“id_household”是我想创建的变量:
structure(list(id_address = c("A", "A", "A", "A", "A", "A", "A",
"B", "B", "B", "C", "D", "E", "E", "F", "F"), id_owner = c(1L,
1L, 2L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 11L, 12L, 13L
), id_parcel = c("m", "n", "n", "o", "o", "p", "q", "s", "r",
"r", "s", "t", "u", "v", "w", "w"), id_household = c(1L, 1L,
1L, 1L, 1L, 2L, 3L, 4L, 5L, 5L, 6L, 7L, 8L, 8L, 9L, 9L)), class = "data.frame", row.names = c(NA,
-16L))
igraph::components
。例如,请参见识别链接的一组连续剧集,以及其中的链接。但是,您需要按组(即“id_address”)进行操作,并将成员资格加入原始数据。 - Henrik