对于我的研究,我想在父/子对话中进行分析。我有一个身份证号码,一个家庭号码和参与者的状态(1和2是孩子,3是父母)。我想让所有家庭至少包含一个孩子和一个父母(" dyad")。因此,在每个family_ID中,至少必须存在状态1或2和3,例如下面示例中的族10001,10002和10004。只包含儿童或父母的家庭(例如以下示例中的家庭10003必须被移除)。
ID_no family_ID status
1 10001 1
2 10001 3
3 10002 1
4 10002 2
5 10002 3
6 10003 1
7 10003 1
8 10004 2
9 10004 3
10 10004 3
我想拥有一个包含family_ID和dyad的数据框(1 =是,0 =否)
family_ID dyad
10001 1
10002 1
10003 0
10004 1
请帮助我。
答案 0 :(得分:0)
以下是基础R
的解决方案:
df1 <- read.table(header=TRUE, stringsAsFactors = FALSE, text=
"ID_no family_ID status
1 10001 1
2 10001 3
3 10002 1
4 10002 2
5 10002 3
6 10003 1
7 10003 1
8 10004 2
9 10004 3
10 10004 3")
with(df1, tapply(status %in% 3, family_ID, FUN=any) &
(tapply(status %in% 1, family_ID, FUN=any) | tapply(status %in% 2, family_ID, FUN=any) )
)
# 10001 10002 10003 10004
# TRUE TRUE FALSE TRUE
变体:
with(df1, tapply(status==3, family_ID, FUN=any) &
(tapply(status==1, family_ID, FUN=any) | tapply(status==2, family_ID, FUN=any) )
)
另一种变体:
tapply(df1$status, df1$family_ID, FUN=function(x) any(x==3) && (any(x==1)||any(x==2)))
以下是data.table
的解决方案:
library("data.table")
setDT(df1)[, .(dyad=any(status==3) && (any(status==1) || any(status==2))), family_ID]
# > setDT(df1)[, .(dyad=any(status==3) && (any(status==1) || any(status==2))), family_ID]
# family_ID dyad
# 1: 10001 TRUE
# 2: 10002 TRUE
# 3: 10003 FALSE
# 4: 10004 TRUE
答案 1 :(得分:0)
这是使用dplyr的版本
library(tidyverse)
dyads.df <- family.df%>%
group_by(family_ID)%>%
mutate(gotParent=3%in%status,gotChild=1%in%status|2%in%status,retain=gotParent&gotChild)%>%
ungroup()%>%
filter(retain==TRUE)%>%
select(1:3)