【发布时间】:2015-04-18 07:35:01
【问题描述】:
我正在尝试将循环重写为 lapply 语句,但我被卡住了,因为我无法弄清楚如何将索引合并到函数中。我最近在 SO 上询问了similar question 并收到了优雅的回复,但回复并没有概括为这个问题。
我正在处理一组记录,这些记录的结构很长。我可以通过唯一的字符串识别每组唯一的记录。我要修复的行总是恰好出现在这些唯一字符串之后的两行。
这是可重现的数据:
text <- c("_____", "A: aaa", "bbb", "C: cccc", "D: dddd",
"_____", "A: aaa:aaa", "bbb", "C: ccc", "D: dddd", "E: eeee",
"_____", "A: aaa", "bbb:bbb", "C: ccc", "D: dddd")
这是我需要它做的循环。它适用于非常小的数据集,但我必须以几种不同的方式将这个逻辑应用于几十万行数据——绝对需要一种更有效的方法!
for(i in 3:length(text)){
text[i] <- ifelse(grepl("\\_{5}", text[i-2]) == TRUE,
paste("B: ", text[i], sep=""), text[i])
text
}
当然,如果 SO 上存在我没有发现的问题,请随时重定向。提前致谢。
【问题讨论】:
-
我没有仔细研究这个问题。但是您可以通过
indx <- which(grepl('_{5}', text)); text[indx+2] <- paste0('B: ', text[indx+2])得到预期的结果 -
啊啊啊……有道理!我当然可以做到。我仍然对在
lapply中加入索引以用于学习目的感到好奇。 -
如果你想在
sapply中使用indx做同样的事情,也许text[indx+2] <- sapply(indx, function(x) paste0('B: ', text[x+2]))(这有点不必要) -
@akrun 你的第一条评论很完美。您的第二条评论澄清了我试图理解的内容,以便更好地理解 apply 函数。
-
它向您展示了在
lapply调用中访问列表索引的几种不同方式。将 for 循环的主体设为函数并从lapply调用它。如果你只是想让你的代码更快,把你的 for 循环放在一个函数中,编译它(通过编译器包),它可能会比lapply更快。如果将整个 for 循环体更改为仅if(grepl("_____",text[i-2],fixed=TRUE)[1L]) text[i] <- paste0("B: ", text[i]),它会更快。