具有相似子串的求和行

时间:2015-08-24 11:53:30

标签: r perl

我有一个数据框(tab-sep),其中包含相同的计数和子ID。 我想结合所有相同子ID的计数。请看例子。 在:

IsomiR                                  185R 68G 60G 134G 124R
hsa-let-7a-3p_ATACAATCTACTGTCTTTCCT     1   6   1   2   2
hsa-let-7a-3p_ATATACAATCTACTGTCTTT      1   0   1   1   4
hsa-let-7a-3p_ATATACAATCTACTGTCTTTC     4   5   2   12  4
hsa-let-7b-3p_ATATACAATCTACTGTCTTTCC    7   5   2   6   3
hsa-let-7b-3p_ATATACAATCTACTGTCTTTCT    15  6   14  49  32
hsa-let-7b-3p_CCATACAATCTACTGTCTTTCT    4   1   1   0   0
hsa-let-7b-3p_CTATACAATCTACTGTCTT       2   2   1   2   3
hsa-let-7c-3p_CTATACAATCTACTGTCTTT      29  7   26  21  19
hsa-let-7c-3p_CTATACAATCTACTGTCTTTC     85  24  73  109 59
hsa-let-7c-3p_CTATACAATCTACTGTCTTTCA    11  3   7   8   3

出:

IsomiR          185R 68G 60G 134G 124R
hsa-let-7a-3p   6    11  4   15   10
hsa-let-7b-3p   28   ..  ..  ..   ..
hsa-let-7c-3p   .. 

1 个答案:

答案 0 :(得分:2)

我们可以将从_开始的子字符串匹配到' IsomiR'中的字符串末尾(.*$)。列,并使用''替换为sub。我们使用它作为分组变量。如果我们使用dplyr执行此操作,summarise_each可用于sum ming多列。

library(dplyr)
df1 %>%
   group_by(IsomiR= sub('_.*$', '', IsomiR)) %>%
   summarise_each(funs(sum))
#         IsomiR X185R X68G X60G X134G X124R
#1 hsa-let-7a-3p     6   11    4    15    10
#2 hsa-let-7b-3p    28   14   18    57    38
#3 hsa-let-7c-3p   125   34  106   138    81

或者,我们可以使用separate中的tidyr {I}分割' IsomiR'通过指定sep='_'列,将其用作分组变量,并在summarise_each select中使用matches

中的正则表达式模式列library(tidyr) separate(df1, IsomiR, into=c('IsomiR', 'unWanted'), sep='_') %>% group_by(IsomiR) %>% summarise_each(funs(sum), matches('[0-9]+[A-Z]$'))
setDT(df1)

使用data.table,我们转换了' data.frame'到' data.table' (sub)。删除' IsomiR'中的子字符串。使用lapply(.SD, ..),将其用作分组变量,遍历列(sum)并获取library(data.table) setDT(df1)[, lapply(.SD, sum), by = .(IsomiR = sub('_.*', '', IsomiR))] (在评论中由@David Arenburg建议)。

aggregate

或另一个选项是我们baseR原始数据集列' IsomiR`之后的transform aggregate(.~IsomiR, transform(df1, IsomiR= sub('_.*', '', IsomiR)), sum) 中的公式方法。

df1 <- structure(list(IsomiR = c("hsa-let-7a-3p_ATACAATCTACTGTCTTTCCT", 
"hsa-let-7a-3p_ATATACAATCTACTGTCTTT", 
"hsa-let-7a-3p_ATATACAATCTACTGTCTTTC", 
"hsa-let-7b-3p_ATATACAATCTACTGTCTTTCC",
"hsa-let-7b-3p_ATATACAATCTACTGTCTTTCT", 
"hsa-let-7b-3p_CCATACAATCTACTGTCTTTCT", "hsa-let-7b-3p_CTATACAATCTACTGTCTT", 
"hsa-let-7c-3p_CTATACAATCTACTGTCTTT", "hsa-let-7c-3p_CTATACAATCTACTGTCTTTC",    
"hsa-let-7c-3p_CTATACAATCTACTGTCTTTCA"), X185R = c(1L, 1L, 4L, 
 7L, 15L, 4L, 2L, 29L, 85L, 11L), X68G = c(6L, 0L, 5L, 5L, 6L, 
1L, 2L, 7L, 24L, 3L), X60G = c(1L, 1L, 2L, 2L, 14L, 1L, 1L, 26L, 
73L, 7L), X134G = c(2L, 1L, 12L, 6L, 49L, 0L, 2L, 21L, 109L, 
8L), X124R = c(2L, 4L, 4L, 3L, 32L, 0L, 3L, 19L, 59L, 3L)),
.Names = c("IsomiR", 
 "X185R", "X68G", "X60G", "X134G", "X124R"), class = "data.frame", 
row.names = c(NA, -10L))

数据

 XmlTextReader reader = new XmlTextReader ("books.xml");
 while (reader.Read()) 
 {
// Do some work here on the data.
    ddl.Items.Add(new ListItem(reader.Name, reader.Name));
 }