2016-03-24 30 views
0

mutasyonunu kullanarak sütun eklenir. Veri sütununa (dat) sahip bir sütun (Seq) (karakter sınıfı) içeren bir sütunum var. Her satırdaki diziyi bölmeye çalışıyorum ve 'A', 'C', 'G', 'T' numaralarını sayıyorum ve her sütunu mutasyon kullanarak ekleyin (dplyr). Aşağıda örnek veri çerçevem ​​ve denediğim kod var. Ben yürütmeye çalışıyorumVeri çerçevesindeki toplam karakter oluşumu nasıl sayılır ve R

Seq 
CAGGACATAA 
TGTCCACTGC 

Kodu:

count_bases <- function (x){ 
    for(i in 1:length(x)){ 
     tab[i] <- table(strsplit((x)[i],"")) 
    } 
    return(tab) 
} 
count_bases(dat$Seq) 

Sadece ilk satır için komutu kullanırsanız: gayet iyi çalışıyor ve bana sonuç verir table(strsplit(dat$Seq[1],"")). Elde çalışıyorum İstenen çıkış yukarıdaki fonksiyon tarafından ve aşağıda gösterilen bir veri çerçevesi oluşturmak için mutasyona:

Seq A C G T 
CAGGACATAA 5 2 2 1 
TGTCCACTGC 1 4 2 3 
+0

'do.call gibi bir şey ((x) rbind, lapply (dat $ Seq, fonksiyon {tablo (strsplit (as.character (x), ""))}))'? – alistaire

+1

ne hakkında cbind (dat, t (apply (dat, 1, function (x) tablosu (strsplit (x, ""))))) '? –

+0

Cevabınız için teşekkür ederiz. Yukarıdaki kodu "do.call" ile denedim ve şu uyarıyı aldım "Uyarı iletisi: In (işlev (..., deparse.level = 1): sonuç sütun sayısı, vektör uzunluğunun() bir katı değil 54) "Doğru bir şey yapıyorum mu? Bu işlev, varolan veri çerçevesine (dat) bu sütunları eklemek için çağrılabilir. Teşekkürler – rkg

cevap

2

Burada herhangi bir uzunluk/bileşimin dizilerin herhangi bir sayıda işlemek tidyr ile dplyr kullanılarak bir çözelti, verilmiştir:

library(tidyr) 
library(dplyr) 

dat <- data.frame(Seq = c("CAGGACATAA", "TGTCCACTGC"), 
             stringsAsFactors = F) 

result <- dat %>% 
      # explode each seq into indvidiual 
      # characters on individual rows 
      mutate(seq.split = strsplit(Seq, "")) %>% 
      unnest() %>% 
      # count by each type of character in eah Seq 
      group_by(Seq, seq.split) %>% 
      summarise(n=n()) %>% 
      # convert to wide table format 
      spread(seq.split, n) 

result 
Source: local data frame [2 x 5] 

     Seq  A  C  G  T 
     (chr) (int) (int) (int) (int) 
1 CAGGACATAA  5  2  2  1 
2 TGTCCACTGC  1  4  2  3  
+0

Bu hatalar benim için şikayet ediyor, n() – alistaire

0

bir çeşit büyük, ama bölmek için strsplit kullanabilir ve sonuçlara genelinde lapply tabloların bir listesini oluşturmak için (lapply fonksiyonu içinde veya bölünme; hangisi tercih). Daha sonra listeyi do.call(rbind ile yeniden birleştirebilir ve data.frame ile mevcut data.frame dosyasına ekleyebilirsiniz. Herhangi bir boşluğun table tarafından eklendiğinden emin olmak içindizesini ve factor parametrelerini dönüştürmeniz gerekir.

dat <- data.frame(Seq = c("ACGACCGGG", "CAGGACATAA", "TGTCCACTGC")) 

data.frame(dat, do.call(rbind, lapply(strsplit(as.character(dat$Seq), ''), function(x){ 
    table(factor(x, levels = c('A', 'C', 'G', 'T'))) 
}))) 
#   Seq A C G T 
# 1 ACGACCGGG 2 3 4 0 
# 2 CAGGACATAA 5 2 2 1 
# 3 TGTCCACTGC 1 4 2 3 
İlgili konular