2017-06-15 8 views
1

私はdplyrパッケージを使用しようとしていますが、変数の扱いに問題があります。要素ベクトルを捕捉して、R dplyr関数で読み取る方法は?

new.data <- my.data %>% group_by(gene) %>% mutate(count = n()) 

しかし、その後、私はパーセンテージとして、文字列の出現を取得したい:

レッツは、私が最初にGROUP_BYと遺伝子あたりのSNPの数を数える私は簡素化データフレーム

my.data <- as.data.frame(matrix(NA), ncol=4, nrow=6) 
my.data <- as.data.frame(cbind(c("d6", "d7", "d8", "d9", "da", "db"), c(rep("C200", 2), rep("C400", 4)), c(rep("a",5), "b"), c("c", rep("a", 5)))) 
colnames(my.data) <- c("snp", "gene", "ind1", "ind2") 

を持っていると言います各列の遺伝子:

new.data %>% group_by(gene) %>% filter(grepl("a", ind1)) %>% dplyr::mutate(perc.a.ind1 = n()/count*100) 
new.data %>% group_by(gene) %>% filter(grepl("a", ind2)) %>% dplyr::mutate(perc.a.ind2 = n()/count*100) 

となります。私は多くの人がいて、私はそれを自動化する必要があります。 だから私は名前のベクトルを作成し、forループの中に私の関数を実行

ind.vec <- colnames(my.data[,3:4]) 
for (i in 1:length(ind.vec){ 
new.data %>% group_by(gene) %>% filter(grepl("a", ind.vec[i])) %>% mutate(percent = n()/count*100) 

}

(私はループが最善ではありません知っている、私はバージョンまたは何か他のものを適用するにアップグレードさせていただきます)私はind.vecのどの要素も認識されていないのと同じように、空のチベットで終わった。

私は問題を特定したと思うと思われるビネットhttps://cran.r-project.org/web/packages/dplyr/vignettes/programming.htmlを読んだが、私はそれを理解しておらず、それを自分のデータで機能させることができない。

私はどのように私はベクトルの要素がdplyrによって認識することができます

ind.vec <- quote(colnames(my.data[,3:4])) 
new.data %>% group_by(gene) %>% filter(grepl("a", !!(ind.vec[i]))) %>% mutate(percent = n()/count*100) 

でいくつかの裁判をしましたか?

助けてもらえますか?

+0

@IanWesley、そのポストに言及してくれてありがとう。それは私の問題ではなくなりましたが、私の場合はind.vec [i]を処理しなければならず、インデックスはas.name(ind.vec)で再調整されていないので問題になります。 –

答えて

0

これはtidyr :: gatherを使用することをお勧めします。

library(tidyverse) 
# or library(dplyr);library(tidyr) 

my.data %>% 
    group_by(gene) %>% 
    mutate(count = n()) %>% 
    gather(ind, string, ind1, ind2) %>% 
    filter(string == "a") %>% 
    group_by(gene, ind, string) %>% 
    mutate(
    n_string = n(), 
    freq = n_string/count * 100) 

# A tibble: 10 x 7 
# Groups: gene, ind, string [4] 
#  snp gene count ind string n_string freq 
# <fctr> <fctr> <int> <chr> <chr> <int> <dbl> 
# 1  d6 C200  2 ind1  a  2 100 
# 2  d7 C200  2 ind1  a  2 100 
# 3  d8 C400  4 ind1  a  3 75 
# 4  d9 C400  4 ind1  a  3 75 
# 5  da C400  4 ind1  a  3 75 
# 6  d7 C200  2 ind2  a  1 50 
# 7  d8 C400  4 ind2  a  4 100 
# 8  d9 C400  4 ind2  a  4 100 
# 9  da C400  4 ind2  a  4 100 
#10  db C400  4 ind2  a  4 100 

何らかの理由で警告が表示されますが、提供された結果と同じです。

0

@SollanoRabeloBraga、ありがとうございます!それは私の問題を解決する。私はその後、私は私の結果を研磨する

new.data <- test[!duplicated(new.data[, c("gene", "ind", "freq")]),] 

new.data <- cast(test2, gene ~ ind) 

をした複数の個人 を含めるために集まるの機能を変更しました。

関連する問題