根据多行值消除个案

Eliminate cases based on multiple rows values

我有一个包含以下信息的基地:

编辑: *每一行是一个住在房子里的人,多个人拥有独特的P_ID和AGE可以同H_ID住在同一栋房子里,我找所有的房子和所有的人,条件是那个房子里至少有一个60岁以上的人,我希望能更好地解释它 *

show(base)

              H_ID           P_ID        AGE        CONACT
1      10010000001   1001000000102        35          33
2      10010000001   1001000000103        12          31
3      10010000001   1001000000104         5          NA
4      10010000001   1001000000101        37          10
5      10010000002   1001000000206         5          NA
6      10010000002   1001000000205        10          NA
7      10010000002   1001000000204        18          31
8      10010000002   1001000000207         3          NA
9      10010000002   1001000000203        24          35
10     10010000002   1001000000202        43          33
11     10010000002   1001000000201        47          10
12     10010000003   1001000000302        26          33
13     10010000003   1001000000301        29          10
14     10010000004   1001000000401        56          32
15     10010000004   1001000000403        22          31
16     10010000004   1001000000402        49          10
17     10010000005   1001000000503         1          NA
18     10010000005   1001000000501        24          10
19     10010000005   1001000000502        23          10
20     10010000006   1001000000601        44          10
21     10010000007   1001000000701        69          32

我想要一份包含所有房屋和住在那里的所有个人的列表,条件是至少有一个 60 岁以上的人,这里是 link 数据:https://drive.google.com/drive/folders/1Od8zlOE3U3DO0YRGnBadFz804OUDnuQZ?usp=sharing

这是我制作底座的方法:

hogares<-read.csv("/home/servicio/Escritorio/TR_VIVIENDA01.CSV")
personas<-read.csv("/home/servicio/Escritorio/TR_PERSONA01.CSV")
datos<-merge(hogares,personas)

base<-data.frame(datos$ID_VIV, datos$ID_PERSONA, datos$EDAD, datos$CONACT)
base

非常感谢任何帮助,谢谢!

要获取有租户 Age > 60 的房屋列表,我们可以 filter 并创建 distinct H_IDs

的列表
house_list <- base %>%
  filter(AGE > 60) %>% 
  distinct(H_ID) %>%
  pull(H_ID)

然后我们可以filter基于house_list的原始数据框删除任何的家庭] 有60岁以上的人

house_df <- base %>%
  filter(H_ID %in% house_list)

然后计算 CON 值,我们可以 filterCONACTgroup_by(H_ID)summarize 中的 NA 值来找到每个房屋中具有非 NA CONACT 值的人数。

CON_calcs <- house_df %>%
  filter(!is.na(CONACT)) %>% 
  group_by(H_ID) %>%
  summarize(Count = n())

join 基于 H_ID 返回到 house_df 以包括新计算的 CON 值,我相信应该以您想要的结果结束。

final_df <- left_join(house_df, CON_calcs, by = 'H_ID')

这可以通过以下方式完成:

添加每个家庭的最大年龄变量

base$maxage <- ave(base$AGE, base$H_ID, FUN=max)

然后只保留最大年龄在 60 岁以上的家庭。

base <- subset(base, maxage >= 60)

或者您可以将两行合二为一。使用链接数据中的列名:

> base <- subset(base, ave(base$datos.EDAD, base$datos.ID_VIV, FUN=max) >= 60)
> head(base)
   datos.ID_VIV datos.ID_PERSONA datos.EDAD datos.CONACT
21  10010000007    1001000000701         69           32
22  10010000008    1001000000803         83           33
23  10010000008    1001000000802         47           33
24  10010000008    1001000000801         47           10
36  10010000012    1001000001204          4           NA
37  10010000012    1001000001203          2           NA

使用 dplyr,我们可以 group_by H_ID 和 select 房子 any AGE 大于 60。

library(dplyr)
df %>% group_by(H_ID) %>% filter(any(AGE > 60))

data.table

类似
library(data.table)
setDT(df)[, .SD[any(AGE > 60)], H_ID]