私は次のタイプのデータを持っています:
Person <- c("A", "B", "C", "D", "E", "E", "F", "G", "H", "I")
MOM <- c( NA, NA, NA, "A", "A", NA, "A", "B", "C", NA)
DAD <- c( NA, NA, NA, "B", "B", NA, "E", "A", "B", NA)
Xv <- 1:10
myd <- data.frame (Person, MOM, DAD, Xv, stringsAsFactors=F)
myd
Person MOM DAD Xv
1 A <NA> <NA> 1
2 B <NA> <NA> 2
3 C <NA> <NA> 3
4 D A B 4
5 E A B 5
6 E <NA> <NA> 6
7 F A E 7
8 G B A 8
9 H C B 9
10 I <NA> <NA> 10
このデータには、PersonとそのMomおよびDad列が含まれます。このデータのファミリーグループを作成したいと思います。NAは情報が不足しています。共通のMOMとDADを持つファミリが定義されます。創設者は、NA、家族=0の両方を持っている人です。
これが私が理解できることですが、それは私にとって不完全です:
fun <- function(i) {
i1 <- if (is.na(myd[i, 2])) i else match(myd[i, 2], myd[1:i, 2])
i2 <- if (is.na(myd[i, 3])) i else match(myd[i, 3], myd[1:i, 3])
min(i1, i2)
}
myd$family <- as.numeric(factor(sapply(1:nrow(myd), fun)))
Person MOM DAD Xv family
1 A <NA> <NA> 1 1
2 B <NA> <NA> 2 2
3 C <NA> <NA> 3 3
4 D A B 4 4
5 E A B 5 4
6 E <NA> <NA> 6 5
7 F A E 7 4
8 G B A 8 6
9 H C B 9 4
10 I <NA> <NA> 10 7
上記の関数は、ある意味で不完全です。家族データには親のデータが含まれていません。たとえば、家族4にはAとBのデータが含まれている必要があります。したがって、完全な家族は次のようになります。
1 A <NA> <NA> 1 1
2 B <NA> <NA> 2 2
4 D A B 4 4
5 E A B 5 4
もう1つのこと(少なくとも私の目的では)、DAD=AおよびMOM=BであることはDAD=BおよびMOM=Aと同じです。したがって、ファミリー4および6は同じAおよびBの親の製品であるため、同じである必要があります。 。
4 D A B 4 4
5 E A B 5 4
8 G B A 8 6
したがって、期待される出力は次のとおりです。
Person MOM DAD Xv family
# founders
1 A <NA> <NA> 1 0
2 B <NA> <NA> 2 0
3 C <NA> <NA> 3 0
10 I <NA> <NA> 10 0
6 E <NA> <NA> 6 0
# Family 1
1 A <NA> <NA> 1 1
2 B <NA> <NA> 2 1
4 D A B 4 1
5 E A B 5 1
8 G B A 8 1
# Family 2
1 A <NA> <NA> 1 2
6 E <NA> <NA> 6 2
7 F A E 7 2
# Family 3
2 B <NA> <NA> 2 3
3 C <NA> <NA> 3 3
9 H C B 9 3
編集:
家族、トリオ、ママ(親1、母、女性)、父(父、親2、男性)、個人/主題など、同様の変数に取り組む必要がある人間の遺伝学では残念です(良いです!)。これにより、すべてが類似し、問題は似ています。
Family vs Trio
1 Nuclear family
A x B
|
C D E
Trio -> 3 trios
A x B A x B A x B
| | |
C D E
質問者からの編集:宿題として以下のコメントに同意します。しばらくの間(宿題の提出時間が経過したと思う時間)、質問に答えないでください。回答があれば、後で投稿します(3か月ほどで)。
編集
創設者の定義-両親が息子/娘であるかどうかが不明であるため、MOM列とDAD列の両方にあります。これらは他のファミリの一部であるため、ファミリ0と見なされますが、リストは実際のファミリではありません。
Person MOM DAD Xv family
1 A <NA> <NA> 1 0
2 B <NA> <NA> 2 0
3 C <NA> <NA> 3 0
10 I <NA> <NA> 10 0
6 E <NA> <NA> 6 0
**家族の定義*家族は、両親(MOMとDAD)とすべての息子と娘で構成されます。PersonDADおよびMOMがAnotherPersonDADおよびMOMと一致する場合、それらは家族と見なされます。たとえば、次のリストのDとEの人はMOM=AとDAD=Bであり、これら2人の個人とDとEは家族で構成されています。次に、創設者リスト(ファミリ0)からの親(AおよびB)のデータをリサイクルする必要があります。
# Family 1
Person MOM DAD Xv family
1 A <NA> <NA> 1 1
2 B <NA> <NA> 2 1
4 D A B 4 1
5 E A B 5 1
また、ここでの人間の状況とは反対に、個体はMOMまたはDAD(性別を切り替えることができます)である可能性があるため、A(MOM)およびB(DAD)によって生成された子孫は、B(MOM)およびA(DAD)によって生成された子孫と同じです。 、したがって、以下を個人の家族1リストに追加する必要があります。
Person MOM DAD Xv family
8 G B A 8 1
したがって、ファミリ1の完全なリストは次のようになります。
Person MOM DAD Xv family
1 A <NA> <NA> 1 1
2 B <NA> <NA> 2 1
4 D A B 4 1
5 E A B 5 1
8 G B A 8 1
ファミリ1は、次のように図式的にスケッチできます。
MOM x DAD MOM x DAD
A | B or B | A
----------------- ------
| | |
D E G
これが部分的な解決策です:
myd1 <- data.frame(myd$DAD, myd$MOM)
myd$family<-as.factor(apply(myd1,1,function(x){paste(x[order(x)],collapse='-')}))
Person MOM DAD Xv family
1 A <NA> <NA> 1 NA-NA
2 B <NA> <NA> 2 NA-NA
3 C <NA> <NA> 3 NA-NA
4 D A B 4 A-B
5 E A B 5 A-B
6 E <NA> <NA> 6 NA-NA
7 F A E 7 A-E
8 G B A 8 A-B
9 H C B 9 B-C
10 I <NA> <NA> 10 NA-NA
NA-NAは創設者であり、崩壊する前に注文するため、ABはBAになります。
残っている問題は、ABファミリーがリサイクルされた人物AとBからのデータを必要としていることです(彼らはファミリーNA-NAグループに属していますが)。
Person MOM DAD Xv family
1 A <NA> <NA> 1 NA-NA
2 B <NA> <NA> 2 NA-NA
4 D A B 4 A-B
5 E A B 5 A-B