2017-10-20 12 views
1

これについての回答を見つけるのは本当に難しく、重複している場合は謝っています。dplyrを使用して条件付きで列内の値を別の列の値に置き換えます

私は質問を説明するためにいくつかのダミーデータを作成します。彼らが1に等しい場合、彼らはの値を取るように私は条件付きで列SAMPLE1SAMPLE2の値を変更する方法に

tibble(a=c(0.1, 0.2, 0.3), sample1 = c(0, 1, 1), sample2 = c(1, 1, 0)) 

# A tibble: 3 x 3 
     a sample1 sample2 
<dbl> <dbl> <dbl> 
1 0.1  0  1 
2 0.2  1  1 
3 0.3  1  0 

結果tibbleは次のようになります。

# A tibble: 3 x 3 
     a sample1 sample2 
<dbl> <dbl> <dbl> 
1 0.1  0  0.1 
2 0.2  0.2  0.2 
3 0.3  0.3  0 

理想的には私は(私は> 100のサンプルの列を持っている)個々のサンプル列のためにこれを行うにはしたくないので、列をループする方法はでしょう(私はループが悪魔であることは分かっているが)より良いことがある。

ありがとうございました!

答えて

1

あなたはifelsemutate_atを使用することができます。

df %>% mutate_at(vars(starts_with('sample')), funs(ifelse(. == 1, a, .))) 

# A tibble: 3 x 3 
#  a sample1 sample2 
# <dbl> <dbl> <dbl> 
#1 0.1  0.0  0.1 
#2 0.2  0.2  0.2 
#3 0.3  0.3  0.0 

vars(starts_with('sample'))試合samplemutate_atで始まるすべての列の各列に機能funs(ifelse(. == 1, a, .))を適用します。 .はここで一致した列を表します。 which()を使用して

df %>% mutate_at(vars(starts_with('sample')), funs(. * a)) 

# A tibble: 3 x 3 
#  a sample1 sample2 
# <dbl> <dbl> <dbl> 
#1 0.1  0.0  0.1 
#2 0.2  0.2  0.2 
#3 0.3  0.3  0.0 
+0

マン..私はmutate_atをしばらく使ってみましたが、ifelse()の代わりにreplace()を使っていました。これは完璧に働いた...ありがとう! – Ryan

+0

'replace'も私の最初の考えでした。しかし、それは条件と交換が同じ長さかリサイクル可能であることが必要で、これはここで 'ifelse'ほど便利ではありません。 – Psidom

-1

非dplyrソリューション:あなたはすべてのサンプル列のみ10が含まれていることを確認している場合


、これを短縮することができる

> t=tibble(a=c(0.1, 0.2, 0.3), sample1 = c(0, 1, 1), sample2 = c(1, 1, 0)) 

> whichRows=which(t$sample1==t$sample2) 

> t[whichRows,c('sample1','sample2')]<-t[whichRows,'a'] 

> t 
# A tibble: 3 x 3 
     a sample1 sample2 
    <dbl> <dbl> <dbl> 
1 0.1  0.0  1.0 
2 0.2  0.2  0.2 
3 0.3  1.0  0.0 
関連する問題