【发布时间】:2021-10-05 09:58:36
【问题描述】:
我想根据地址和地块所有权将个人分成不同的家庭。如果人们居住在相同的地址,并且如果他们通过至少一个地块的所有权直接或间接联系在一起,则他们属于同一家庭。
个人之间的联系可以是直接,即两个人有一个共同的包裹。但是链接也可以是间接,通过交叉链接形成链 - 两个人有一个共同的包裹,其中一个人与其他人有一个共同的包裹,并且都住在同一个地址。
这里有一些例子:
- 如果一个人 (9) 独自住在他的地址 (C),即使另一个人 (6) 也拥有他或她的地块,他也将独自拥有他的家人。
- 如果两个人(12 和 13)住在同一个地址 (F) 并拥有同一个地块 (w),那么他们属于同一个家庭。但是如果三个人住在同一个地址 (B) 但只有两个人 (7 和 8) 拥有同一个地块 (r) 和第三个人 (6) 住在这个地址 (B) 但拥有另一个地块 (m)只有拥有同一个地块的两个人来自同一个家庭。
- 如果在同一个地址 (A),有 4 个人居住(1、2、3 和 4),如果个人(1、2 和 3)通过拥有多个包裹(m、n 和 o)联系在一起,那么他们属于同一家庭,而同样居住在该地址但不拥有这 3 个地块中的任何一个但另一个 (p) 的人 (4) 不属于同一家庭。
我有三个变量:地址 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可以用在这里。参见例如identify groups of linked episodes which chain together 并在其中链接。不过,您需要按组进行操作,即通过“id_address”,然后将成员资格加入到原始数据中。 -
另一个类似的:function to track the changes in a field。我敢打赌,有人可以挖掘出一个正确的规范答案;)
-
这里提出的问题/问题是什么?