2

私は次のタイプのデータを持っています:

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
4

2 に答える 2

3

あなたがこれをまだ理解しているかどうかはわかりませんが、ここに1つの解決策があります。

まず、あなたのデータ:

# Your data
myd <- data.frame(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, stringsAsFactors=F)

次に、元のデータの2列目と3列目をマージしてファミリを識別します。これをリストに使用しsplitますdata.frame

# Identifying the families
fam = apply(myd[2:3], 1, function(x) paste0(sort(x), collapse=" "))

第三に、をdata.frameリストに分割します。この場合、4つdata.frameのリストが作成されます。1つは創設者用、もう1つは各ファミリ用です。

# Splitting the data by founders and families
temp_1 = split(myd, fam)
names(temp_1)[1] = "Founders"

第4に、どのファウンダーがどのファミリーに属しているかを識別するために、いくつかの単純なマッチングとサブセット化を行います。

# Identify which families the founders belong to
temp_2 = lapply(1:length(temp_1),
                function(x) temp_1[[1]][which(temp_1[[1]]$Person %in% 
                  unique(unlist(temp_1[[x]][,c(2,3)], use.names=FALSE))),])

そして最後に、rbindこのデータを一緒に。

# "Merging" (with rbind) founders and their families
OUT = lapply(1:length(temp_1), function(x) rbind(temp_2[[x]], temp_1[[x]]))
names(OUT) = names(temp_1)

これは出力です:

OUT
# $Founders
#    Person  MOM  DAD Xv
# 1       A <NA> <NA>  1
# 2       B <NA> <NA>  2
# 3       C <NA> <NA>  3
# 6       E <NA> <NA>  6
# 10      I <NA> <NA> 10
# 
# $`A B`
#   Person  MOM  DAD Xv
# 1      A <NA> <NA>  1
# 2      B <NA> <NA>  2
# 4      D    A    B  4
# 5      E    A    B  5
# 8      G    B    A  8
# 
# $`A E`
#   Person  MOM  DAD Xv
# 1      A <NA> <NA>  1
# 6      E <NA> <NA>  6
# 7      F    A    E  7
# 
# $`B C`
#   Person  MOM  DAD Xv
# 2      B <NA> <NA>  2
# 3      C <NA> <NA>  3
# 9      H    C    B  9

更新:data.frame出力

を優先する場合はdata.frame、前の手順を完了したlist、次の手順を実行できます。

OUT = do.call("rbind", 
              lapply(1:length(OUT), 
                     function(x) cbind(OUT[[x]], fam = names(OUT[x]))))
OUT
#    Person  MOM  DAD Xv      fam
# 1       A <NA> <NA>  1 Founders
# 2       B <NA> <NA>  2 Founders
# 3       C <NA> <NA>  3 Founders
# 6       E <NA> <NA>  6 Founders
# 10      I <NA> <NA> 10 Founders
# 11      A <NA> <NA>  1      A B
# 21      B <NA> <NA>  2      A B
# 4       D    A    B  4      A B
# 5       E    A    B  5      A B
# 8       G    B    A  8      A B
# 12      A <NA> <NA>  1      A E
# 61      E <NA> <NA>  6      A E
# 7       F    A    E  7      A E
# 22      B <NA> <NA>  2      B C
# 31      C <NA> <NA>  3      B C
# 9       H    C    B  9      B C
于 2012-08-05T17:13:41.740 に答える
2

各「ファミリ」で同じ文字ベクトルが必要な場合は、interaction関数の使用がよりコンパクトになります。これらの線に沿った何か:

myd$fam <- with( myd, as.character( interaction(MOM,DAD)))
myd$fam[ is.na(myd$fam) ] <- 0

数字が必要な場合(これは賢明ではないようですが、それがあなたのリクエストを提供した方法です)、代わりにas.characteras.numeric

myd$fam <- with( myd, as.numeric( interaction(MOM,DAD)))
myd$fam[ is.na(myd$fam) ] <- 0

「A」でMOMとDADの両方を表す方法がわかりませんでした。あなたは、人間の遺伝学のその側面をどのように理解しているかを説明することに取り組む必要があるかもしれません。家族用分割用split

> split(myd, myd$fam)
$`0`
   Person  MOM  DAD Xv fam
1       A <NA> <NA>  1   0
2       B <NA> <NA>  2   0
3       C <NA> <NA>  3   0
6       E <NA> <NA>  6   0
10      I <NA> <NA> 10   0

$`2`
  Person MOM DAD Xv fam
8      G   B   A  8   2

$`4`
  Person MOM DAD Xv fam
4      D   A   B  4   4
5      E   A   B  5   4

$`6`
  Person MOM DAD Xv fam
9      H   C   B  9   6

$`7`
  Person MOM DAD Xv fam
7      F   A   E  7   7
于 2012-07-18T01:53:10.930 に答える