好吧,我有一个小问题,我相信我可以解决which和grepl(替代品的欢迎),但我迷路:
my_query<- c('g1', 'g2', 'g3')
my_data<- c('string2','string4','string5','string6')
Run Code Online (Sandbox Code Playgroud)
我想在my_query匹配中返回索引my_data.在上面的示例中,只有'g2' mydata,因此示例中的结果将是2.请帮忙 :)
在我看来,如果没有循环,没有简单的方法可以做到这一点.对于每个元素my_query,我们可以使用以下任一函数来获取TRUE或FALSE:
f1 <- function (pattern, x) length(grep(pattern, x)) > 0L
f2 <- function (pattern, x) any(grepl(pattern, x))
Run Code Online (Sandbox Code Playgroud)
例如,
f1(my_query[1], my_data)
# [1] FALSE
f2(my_query[1], my_data)
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)
然后,我们使用*apply循环应用,说f2来的所有元素my_query:
which(unlist(lapply(my_query, f2, x = my_data)))
# [1] 2
Run Code Online (Sandbox Code Playgroud)
谢谢,这似乎工作.说实话,我更喜欢你的单行原版.我不确定你为什么编辑创建另一个函数来事后调用
*apply.相比之下有什么优势which(lengths(lapply(my_query, grep, my_data)) > 0L)吗?
好吧,我不完全确定.当我读到?lengths:
One advantage of ‘lengths(x)’ is its use as a more efficient
version of ‘sapply(x, length)’ and similar ‘*apply’ calls to
‘length’.
Run Code Online (Sandbox Code Playgroud)
我不知道lengths与之相比有多高效sapply.无论如何,如果它仍然是一个循环,那么我的原始建议which(lengths(lapply(my_query, grep, my_data)) > 0L)是执行2循环.我的编辑基本上将两个循环组合在一起,希望得到一些提升(如果不是太小).
您仍然可以将我的新编辑安排到一行中:
which(unlist(lapply(my_query, function (pattern, x) any(grepl(pattern, x)), x = my_data)))
Run Code Online (Sandbox Code Playgroud)
要么
which(unlist(lapply(my_query, function (pattern) any(grepl(pattern, my_data)))))
Run Code Online (Sandbox Code Playgroud)