0

データフレームのリストでデータフレームを分割したいと思います。それを分割する理由は、常にfatherが続きmother、次に が続くということoffspringです。ただし、これらのファミリ メンバーには複数の行がある場合があります (これらは常に連続しています。たとえばfather、番号 1 は行 1 と行 2 にあります)。以下の例では、2 つのファミリがあり、2 つのデータ フレームを含むリストを取得しようとしています。

私の入力:

df <- 'Chr  Start   End Family
1   187546286   187552094   father
3   108028534   108032021   father
1   4864403 4878685 mother
1   18898657    18904908    mother
2   460238  461771  offspring
3   108028534   108032021   offspring
1   71481449    71532983    father
2   74507242    74511395    father
2   181864092   181864690   mother
1   71481449    71532983    offspring
2   181864092   181864690   offspring
3   160057791   160113642   offspring'

df <- read.table(text=df, header=T)

したがって、期待される出力dfout[[1]]は次のようになります。

dfout <- 'Chr   Start   End Family
1   187546286   187552094   father
3   108028534   108032021   father
1   4864403 4878685 mother
1   18898657    18904908    mother
2   460238  461771  offspring
3   108028534   108032021   offspring'

dfout - read.table(text=dfout, header=TRUE)
4

2 に答える 2

1

各ファミリを個別のデータ フレームに分割するには、あるファミリが終了し、別のファミリが開始する場所を示すインデックスが必要です。インデックスは「父」を変化点にしました。indx <- df$Family == "father"ただし、複数の「父」エントリが連続して存在する可能性があるため、単純に使用することはできません。代わりに、1 に等しい場所を検索することで、「子孫」から「父」への切り替えをテストします。

indx <- cumsum(c(1L, diff(df$Family == "father")) == 1L)
split(df, indx)
# $`1`
#   Chr     Start       End    Family
# 1   1 187546286 187552094    father
# 2   3 108028534 108032021    father
# 3   1   4864403   4878685    mother
# 4   1  18898657  18904908    mother
# 5   2    460238    461771 offspring
# 6   3 108028534 108032021 offspring
# 
# $`2`
#    Chr     Start       End    Family
# 7    1  71481449  71532983    father
# 8    2  74507242  74511395    father
# 9    2 181864092 181864690    mother
# 10   1  71481449  71532983 offspring
# 11   2 181864092 181864690 offspring
# 12   3 160057791 160113642 offspring
于 2016-10-31T16:26:38.373 に答える