首页 > 解决方案 > R:试图理解逻辑以便用 lapply() 替换循环

问题描述

我是 R 的初学者,我想更熟悉 apply() 函数,因为据我所知,R 中通常会避免循环。

有一些双重或三重循环(循环内循环内循环)我很难用 lapply() 函数“替换”它们。

因此,例如,我有以下代码:

im <- 1
ig <- 1
for(im in 1:nrow(dataframe1)){
  for(ig in 1:nrow(dataframe2)){
    if(grepl(dataframe2$name[ig], dataframe1$Text[im])){
      dataframe1$reference[im] <- dataframe1$reference[im] + 1
      cat("match found between:", im, "and ig:", ig)
      ig <- ig + 1
    }else{
      cat("no word match found between im:", im, "and ig:", ig)
      ig <- ig + 1
    }}
  im <- im + 1
  ig <- 1
}

如何用 R 中的 lapply()(或 apply() 或 sapply())函数替换这两个循环?希望在那之后进入 apply() 逻辑。

标签: rloopsfor-loopapplylapply

解决方案


我试图用*apply函数重写你的循环(更正),我相信在这种情况下,你最好使用好的旧for循环。

使用组成的数据集,这是您的代码,但正确。

dataframe1 <- data.frame(Text = c("Ronald Fisher", "Karl Pearson", "William Gosset",
                                  "Harald Cramer", "Andrey Kolmogorov"),
                          reference = 11:15, stringsAsFactors = FALSE)

dataframe2 <- data.frame(name = c("Ronald", "Harald"), stringsAsFactors = FALSE)

for(im in 1:nrow(dataframe1)){
  for(ig in 1:nrow(dataframe2)){
    if(grepl(dataframe2$name[ig], dataframe1$Text[im])){
      dataframe1$reference[im] <- dataframe1$reference[im] + 1
      cat("match found between:", im, "and ig:", ig, "\n")
    }else{
      cat("no word match found between im:", im, "and ig:", ig, "\n")
    }
  }
}

dataframe1
#               Text reference
#1     Ronald Fisher        12
#2      Karl Pearson        12
#3    William Gosset        13
#4     Harald Cramer        15
#5 Andrey Kolmogorov        15

推荐阅读