【问题标题】:How to incorporate index in R lapply statements [duplicate]如何在 R lapply 语句中合并索引 [重复]
【发布时间】: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 &lt;- which(grepl('_{5}', text)); text[indx+2] &lt;- paste0('B: ', text[indx+2]) 得到预期的结果
  • 啊啊啊……有道理!我当然可以做到。我仍然对在lapply 中加入索引以用于学习目的感到好奇。
  • 如果你想在sapply 中使用indx 做同样的事情,也许text[indx+2] &lt;- 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] &lt;- paste0("B: ", text[i]),它会更快。

标签: r for-loop lapply


【解决方案1】:

要将索引合并到lapply,请执行以下操作:

lapply(1:length(text), function(i) doStuff(text[i]) )

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 2021-06-02
    • 2021-10-24
    • 1970-01-01
    • 2018-07-22
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多