如何使计数值列表的结果变得像数据框的功能一样一目了然

时间:2019-04-01 20:19:12

标签: r function dataframe

我有以下数据框:

v1        v2       v3
+         S10      tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt
+        AMPC      tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa
+        AROH      gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg

我在v3上执行转换,将字符串每2个字母分割一次,并获得每对字母的出现次数,如下所示:

lapply(df$v3, function(x) oligonucleotideFrequency(DNAString(x), width = 2))

这是v3中第一个字符串的转换结果:

AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4 

现在我拥有v3字符串中每对字母的所有值计数,但是每个计数都是分开的,并且不提供全局值。现在,我想做的是使每对字母成为数据帧的一个特征,其中每个特征的值将是每对字母在同一字符串中出现的次数。

是这样的:

v1        v2     AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
+         S10     3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4                        
+        AMPC     3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3 
+        AROH     2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9

我如何获得此结果?

预先感谢

1 个答案:

答案 0 :(得分:1)

使用基数R的解决方案。

library(Biostrings)

dat <- read.table(text = "v1        v2       v3
'+'         'S10'      'tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt'
'+'        'AMPC'      'tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa'
'+'        'AROH'      'gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg'",
stringsAsFactors = FALSE, header = TRUE)

# Count the nucleotide number  
lst1 <- lapply(dat$v3, function(x) oligonucleotideFrequency(DNAString(x), width = 2))
# Transpose the vector and convert to a data frame for each element
lst2 <-  lapply(lst1, function(x) as.data.frame(t(x)))
# Comebine all single data frame into one data frame row-wise
dat2 <- do.call(rbind, lst2)
# Comebine with the original data frame column-wise
dat3 <- cbind(dat, dat2)
# Remvoe the v3 column
dat3$v3 <- NULL
dat3
#   v1   v2 AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT
# 1  +  S10  3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4
# 2  + AMPC  3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3
# 3  + AROH  2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9