2016-10-31 5 views
0

データフレームのリストでデータフレームを分割したいと考えています。それを分割する理由は、我々は常にfatherと、それに続くと、それに続く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) 
+2

データフレームの行を1つのファミリから次のファミリに移動するときにどのような論理があるかはわかりません。 – Phil

答えて

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 
0

に等しいを検索することにより、「父」から「子孫」からスイッチは、それがより参考になるところをテスト。私はすべてをやり直す時間がありませんが、それがどのように機能するかを一般的な意味で示します。

gender <- c("M","M","F","F","F","F","M","M","M","M","F","F") 
values <- c(20,22,24,19,9,17,18,22,12,14,7,8) 
fruit <- c("apple","pear","mango","mango","mango","apple","banana","banana","banana","mango","apple","apple") 
df <- data.frame(gender, values, fruit) 


> df 
    gender values fruit 
1  M  20 apple 
2  M  22 pear 
3  F  24 mango 
4  F  19 mango 
5  F  9 mango 
6  F  17 apple 
7  M  18 banana 
8  M  22 banana 
9  M  12 banana 
10  M  14 mango 
11  F  7 apple 
12  F  8 apple 

split(df, df$gender) 

$F 
    gender values fruit 
3  F  24 mango 
4  F  19 mango 
5  F  9 mango 
6  F  17 apple 
11  F  7 apple 
12  F  8 apple 

$M 
    gender values fruit 
1  M  20 apple 
2  M  22 pear 
7  M  18 banana 
8  M  22 banana 
9  M  12 banana 
10  M  14 mango 
関連する問題