Исключить случаи на основе значений нескольких строк - PullRequest
0 голосов
/ 13 марта 2020

У меня есть база со следующей информацией:

изменить: * каждая строка представляет собой человека, который живет в доме, несколько человек с уникальный 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+, вот ссылка на данные: 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

Любая помощь очень ценится, спасибо!

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

Это можно сделать следующим образом:

Добавление переменной с максимальным возрастом на домохозяйство

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

1 голос
/ 13 марта 2020

Используя dplyr, мы можем group_by H_ID и выбрать дома, где 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]
0 голосов
/ 13 марта 2020

Чтобы получить список домов с арендатором Age > 60 мы можем filter и создать список distinct H_ID s

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 значения, которые мы можем filter из NA значений в CONACT, group_by(H_ID) и summarize, чтобы найти число людей в каждом доме, которые имеют не-NA CONACT значение.

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

И join, которые возвращаются в house_df на основе H_ID для включения недавно вычисленных CON значений, и я считаю, что это должно закончиться вашим желаемым результатом.

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