R: Попытка понять логику, чтобы заменить циклы на lapply () - PullRequest
0 голосов
/ 19 мая 2018

Я новичок в 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
}

Как я могу заменить два цикла функцией lapply () (или apply (), или sapply ()) в R?Надеясь попасть в логику apply () после этого.

1 Ответ

0 голосов
/ 19 мая 2018

Я попытался переписать ваши циклы (исправлено) с помощью функций *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
...