How to count total character occurence in data frame and add column using mutate in R
我有一个数据帧(
1 2 3 | Seq CAGGACATAA TGTCCACTGC |
我要执行的代码:
1 2 3 4 5 6 7 | count_bases <- function (x){ for(i in 1:length(x)){ tab[i] <- table(strsplit((x)[i],"")) } return(tab) } count_bases(dat$Seq) |
如果我仅在第一行使用命令:
1 2 3 | Seq A C G T CAGGACATAA 5 2 2 1 TGTCCACTGC 1 4 2 3 |
这是使用dplyr和tidyr的解决方案,该解决方案可以处理任何长度/组成的任意数量的序列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 |
有点大,但是您可以使用
1 2 3 4 5 6 7 8 9 | 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 |