我在R工作,我有一个包含表观遗传信息的数据框。我有300,000行包含基因组位置和15列,每列确定可能或可能不在每个基因座发生的转录因子基序。
我正在尝试使用正则表达式来计算每个转基因因子在每个基因组基因座上发生的次数。可以发生单个基序>在任何一个基因座上15次,所以我希望输出是一个矩阵/数据帧,包含数据帧的每个单独单元的主题计数。
细胞中典型的单一基序可能是:
2212(AATTGCCCCACA,-,0.00)
然而,如果有多个主题出现,那么它们将作为连续字符串存在于单元格中,每个条目用逗号分隔,例如两个条目:
144(TGTGAGTCAC,+,0.00),145(GTGAGTCACT,-,0.00)
以下是一些玩具数据:
df <-data.frame(NAMES = c('LOC_A', 'LOC_B', 'LOC_C', 'LOC_D'),
TFM1 = c("144(TGTGAGTCAC,+,0.00),145(GTGAGTCACT,-,0.00)", "2(TGTGAGTCAC,+,0.00)", "0", "0"),
TFM2 = c("632(TAAAGAGTCAC,-,0.00),60(GTCCCTCACT,-,0.00),", "7(TGTGAGTCAC,+,0.00)", "7(TGTGAGTCAC,+,0.00)", "0"),
stringsAsFactors = F)
我正在寻找以下格式的输出:
NAMES TFM1 TFM2
LOC_A 2 2
LOC_B 1 1
LOC_C 0 1
LOC_D 0 0
如果可能的话,我想避免for循环,但如果需要循环,那就这样吧。为了获得此数据框的行数,我使用了以下代码,由@akrun推荐:
df$MotifCount <- Reduce(`+`, lapply(df[-1],
function(x) lengths(str_extract_all(x, "\\d+\\("))))
请注意,此处使用的主题的唯一标识符是“\\ d + \\(”以获取每个主题标识字符串开头的数字和左括号。这必须包含在任何解决方案代码中。在整个数据框架中起作用以提供单个细胞计数的类似物将是理想的。
非常感谢
答案 0 :(得分:1)
我们不需要Reduce
部分
data.frame(c(df[1],lapply(df[-1], function(x) lengths(str_extract_all(x, "\\d+\\(")))) )
# NAMES TFM1 TFM2
#1 LOC_A 2 2
#2 LOC_B 1 1
#3 LOC_C 0 1
#4 LOC_D 0 0
答案 1 :(得分:1)
这也有效:
cbind.data.frame(df[1],sapply(lapply(df[-1], function(x) str_extract_all(x, "\\d+\\(")), function(x) lapply(x, length)))
# NAMES TFM1 TFM2
#1 LOC_A 2 2
#2 LOC_B 1 1
#3 LOC_C 0 1
#4 LOC_D 0 0