web-dev-qa-db-ja.com

mutate(dplyr)でカスタム関数を使用するにはどうすればよいですか?

Dplyrを使用してすべてのコードを書き直しており、mutate/mutate_at関数のヘルプが必要です。必要なのは、テーブルの2つの列にカスタム関数を適用することだけです。理想的には、これらの列をインデックスで参照しますが、名前で参照しても機能させることはできません。

機能は次のとおりです。

binom.test.p <- function(x) {
  if (is.na(x[1])|is.na(x[2])|(x[1]+x[2])<10) {
    return(NA)
  } 
  else {
    return(binom.test(x, alternative="two.sided")$p.value)
  }
} 

私のデータ:

table <- data.frame(geneId=c("a", "b", "c", "d"), ref_SG1_E2_1_R1_Sum = c(10,20,10,15), alt_SG1_E2_1_R1_Sum = c(10,20,10,15))

私もです:

table %>%
  mutate(Ratio=binom.test.p(c(ref_SG1_E2_1_R1_Sum, alt_SG1_E2_1_R1_Sum)))
Error: incorrect length of 'x'

私が行った場合:

table %>% 
mutate(Ratio=binom.test.p(ref_SG1_E2_1_R1_Sum, alt_SG1_E2_1_R1_Sum))
Error: unused argument (c(10, 20, 10, 15))

2番目のエラーは、おそらく私の関数が1つのベクトルを必要とし、代わりに2つのパラメーターを取得するためです。

しかし、私の機能を忘れることさえあります。これは機能します:

table %>%
  mutate(sum = ref_SG1_E2_1_R1_Sum + alt_SG1_E2_1_R1_Sum)

これはしません:

    table %>%
      mutate(.cols=c(2:3), .funs=funs(sum=sum(.)))
Error: wrong result size (2), expected 4 or 1

ですから、おそらくdplyrがどのように機能するかについての私の誤解です。

8
kintany

問題はdplyrではなくbinom.testのようです。binom.testはベクトル化されていないため、ベクトルで機能することは期待できません。 mapplyの2つの列でmutateを使用できます。

table %>% 
    mutate(Ratio = mapply(function(x, y) binom.test.p(c(x,y)), 
                          ref_SG1_E2_1_R1_Sum, 
                          alt_SG1_E2_1_R1_Sum))

#  geneId ref_SG1_E2_1_R1_Sum alt_SG1_E2_1_R1_Sum Ratio
#1      a                  10                  10     1
#2      b                  20                  20     1
#3      c                  10                  10     1
#4      d                  15                  15     1

最後のものについては、mutateの代わりにmutate_atが必要です。

table %>%
      mutate_at(.vars=c(2:3), .funs=funs(sum=sum(.)))
7
Psidom