2017-05-08 6 views
0

ネストされたifelse()ステートメントを使用して、条件付きで別のデータフレームの値を別のデータフレームの値に置き換えたいとします。しかし、私はapplyを使ってこれをデータフレーム全体に拡張するのに問題があります。可能であれば、ループや非ベースパッケージを避けたい。別のdata.frameからのインデックスを使用してifelseで適用します。

最初は6つのobsを持つデータフレームです。

> locus_test 
    locus gt0 gt1 gt2 
1  L1 G G A A G A 
2  L2 T T G G T G 
3  L3 A A C C A C 
4  L4 T T A A T A 
5  L5 G G C C G C 
6  L6 C C A A C A 
7  L7 T T C C T C 
8  L8 A A G G A G 
9  L9 A A G G A G 
10 L10 G G A A G A 

私は値を交換したいと思います:;各変数に関する

> snp_test 
    L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 
1 1 2 - 0 2 0 0 0 0 2 
2 1 0 - 0 - 1 0 - - 2 
3 - - - 0 - - 0 - - 1 
4 2 0 0 0 0 - 0 0 0 0 
5 2 0 - 0 2 - 0 0 0 1 
6 1 0 - 0 0 0 0 0 - 0 

第二は、データの3つの列(それぞれがスペースで区切られた2つの文字である文字)が含まれて:10個の文字変数のlocus_testの値を使用してsnp_testに追加します。たとえば、L1 == 1の場合、1はlocus_test $ gt1( "A A")の対応する値に置き換えられます。 L1 == 2の場合、gt2列の値が使用されます( "G A")。

私は別に、各変数のためにこれを行うことができます。

ifelse(snp_test[,1]==1,locus_test$gt1[locus_test$locus =="L1"],snp_test[,1]) 

それから私だろう巣ifelse、3つの異なる値は、例えばlocus_testでそれに対応する値に置き換えられるように:

ifelse(ifelse(snp_test[,1]==1,locus_test$gt1[locus_test$locus =="L1"],snp_test[,1])==2,locus_test$gt2[locus_test$locus =="L1"],ifelse(snp_test[,1]==1,locus_test$gt1[locus_test$locus =="L1"],snp_test[,1])) 

など...

しかし、これをsnp_testのすべての変数に適用すると、つまり

apply(snp_test,2,function(x)ifelse(x==1,locus_test$gt1,x)) 

locus_test $ gt1の最初の6つの値が、各列に関連する単一の値ではなく、置換値として使用されています。だから私は、例えば、snp_testのL1列で置き換えられる値がlocus_testのL1に対応する3つの変数のうちの1つにしかならないように、必要なインデックスをどのように追加できるかを知りたいと思います。言い換えれば

、どのように私はifelseのサブセット一部を指定することができます。

適用で
locus_test$gt1[locus_test$locus =="L1"] 

答えて

0

は、ここに1つの方法だ

library(tidyverse) 
left_join(
    snp_test %>% tibble::rownames_to_column() %>% gather(locus, key, -rowname), 
    gather(locus_test, key, value, -locus) %>% mutate(key=substr(key,3,3)), 
    by = c("locus", "key") 
) %>% 
    select(-key) %>% 
    mutate(value=if_else(is.na(value),"-",value)) %>% 
    spread(locus, value) 
# rowname L1 L10 L2 L3 L4 L5 L6 L7 L8 L9 
# 1  1 AA GA TG - TT GC CC TT AA AA 
# 2  2 AA GA TT - TT - AA TT - - 
# 3  3 - AA - - TT - - TT - - 
# 4  4 GA GG TT AA TT GG - TT AA AA 
# 5  5 GA AA TT - TT GC - TT AA AA 
# 6  6 AA GG TT - TT GG CC TT AA - 
関連する問題