如何将行拆分为固定大小并在每个行或子列表上应用grep

时间:2014-11-10 20:52:33

标签: r

有没有办法将数据框行拆分为固定大小并在每行上应用grep

我发现只有这个函数,但它返回一个包含许多子列表的列表。

split(x, (0:nrow(x) %/% 300))

如果没办法,我如何在每个子列表中应用函数grep

编辑:

重复性小的例子:

a=c("cagtcccaaccataacagaagctggcctcctgaagcttacagtcaaaaac")
b=c("aatgattaaacatccatgcttatgaattccactgcagcctgctataactg")
c=c("taacaacatttaataatgaaagtaaatctgctacccccattatattttgc")

k=rbind(a,b,c)

1 个答案:

答案 0 :(得分:0)

关于你在问题中的小例子,我认为它可能不太适合,因为它不会真正产生一个列表,而split会产生一个列表。所以我稍微改变了你的例子:

a=c("cagtcccaaccataacagaagctggcctcctgaagcttacagtcaaaaac")
b=c("aatgattaaacatccatgcttatgaattccactgcagcctgctataactg")
c=c("taacaacatttaataatgaaagtaaatctgctacccccattatattttgc")

lst <- list(a,b,c)
lst
#[[1]]
#[1] "cagtcccaaccataacagaagctggcctcctgaagcttacagtcaaaaac"
#
#[[2]]
#[1] "aatgattaaacatccatgcttatgaattccactgcagcctgctataactg"
#
#[[3]]
#[1] "taacaacatttaataatgaaagtaaatctgctacccccattatattttgc"

现在,要将grep应用于每个元素,您可以执行以下操作:

lapply(lst, function(vec) grep("a", vec))
#[[1]]
#[1] 1
#
#[[2]]
#[1] 1
#
#[[3]]
#[1] 1

这看起来并不是很有意义,但是您可以了解如何使用lapplygrep应用于列表的每个元素(希望如此)。当然,您可以进一步修改grep或您想要应用的任何功能。

修改

也许这就是“grep每个列表的每个列表”的意思吗?

lapply(lst, function(vec){
  x <- gregexpr("a+", vec, perl = TRUE)
  res <- regmatches(vec, x)
  res
}) 

#[[1]]
#[[1]][[1]]
#[1] "a"     "aa"    "a"     "aa"    "a"     "aa"    "aa"    "a"     "a"     "aaaaa"
#
#
#[[2]]
#[[2]][[1]]
#[1] "aa"  "a"   "aaa" "a"   "a"   "a"   "aa"  "a"   "a"   "a"   "aa" 
#
#
#[[3]]
#[[3]][[1]]
#[1] "aa"  "aa"  "a"   "aa"  "aa"  "aaa" "aaa" "a"   "a"   "a"   "a"  

编辑2

lapply(lst, function(vec){
   x <- gregexpr("a+", vec, perl = TRUE)
   res <- sum(attr(x[[1]], "match.length"))
   res
})
#[[1]]
#[1] 18
#
#[[2]]
#[1] 16
#
#[[3]]
#[1] 19