根据多行值消除个案
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_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
出 CONACT
、group_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]
我有一个包含以下信息的基地:
编辑: *每一行是一个住在房子里的人,多个人拥有独特的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_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
出 CONACT
、group_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]