根据R中不同行的值创建索引变量

时间:2018-03-12 13:36:27

标签: r variables

对于我的研究,我想在父/子对话中进行分析。我有一个身份证号码,一个家庭号码和参与者的状态(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

请帮助我。

2 个答案:

答案 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)