有没有办法将数据框行拆分为固定大小并在每行上应用grep
?
我发现只有这个函数,但它返回一个包含许多子列表的列表。
split(x, (0:nrow(x) %/% 300))
如果没办法,我如何在每个子列表中应用函数grep
?
编辑:
重复性小的例子:
a=c("cagtcccaaccataacagaagctggcctcctgaagcttacagtcaaaaac")
b=c("aatgattaaacatccatgcttatgaattccactgcagcctgctataactg")
c=c("taacaacatttaataatgaaagtaaatctgctacccccattatattttgc")
k=rbind(a,b,c)
答案 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
这看起来并不是很有意义,但是您可以了解如何使用lapply
将grep
应用于列表的每个元素(希望如此)。当然,您可以进一步修改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"
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