R:试图理解逻辑以用lapply()替换循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()逻辑。

答案

我试图用*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, "
")
    }else{
      cat("no word match found between im:", im, "and ig:", ig, "
")
    }
  }
}

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

以上是关于R:试图理解逻辑以用lapply()替换循环的主要内容,如果未能解决你的问题,请参考以下文章

lapply vs for 循环 - 性能 R

使用循环或lapply来读取和命名文件

如何在 lapply (R) 中显式定义附加参数

用该列的中位数替换矩阵每一列中的 NA

对具有相同结构的几个数据集使用lapply并可能进行for循环以提取和计算每个数据帧的值

R中的并行化“查找”循环