在R中执行if语句时出错

时间:2015-05-01 16:57:33

标签: r text-processing

我有这个小功能来获取文本的辅助分数

getAssonanceScore <- function(book, count) {
  #for each sentence

  for (i in length(book[[1]])){
    words <- strsplit(book[i], "\\ ")

      for (j in length(words[[1]])){
         if (substr(words[[1]][j],1,1) == substr(words[[1]][j+1],1,1) ) {
          count <- count + 1 
         }

      }

  }

  count <- count / length(book)

  return (count)
}

它的作用是获得一个列表,其第一个位置有一行文本,第二个位置有第二行文本,依此类推。获得此行后,它会拆分句子,并将其放入包含所有组成单词的列表中。我这样做是因为我将第一个单词的第一个字母与第二个单词的第一个字母进行比较,将第二个单词的第一个字母与第三个单词的第一个字母进行比较以获得总共振分数。然后将其除以书的长度。当我尝试使用以下形式的小输入列表'word'测试此函数时:

> words
[1] "babbling brook by blue grass"

它给了我这个错误:

> Error in if (substr(words[[1]][j], 1, 1) == substr(words[[1]][j + 1], 
> :    missing value where TRUE/FALSE needed

我在RStudio工作,而且非常初学R,任何帮助都会非常感激。谢谢!

编辑:它应该是getAlliterationScore而不是getAssonanceScore:D

1 个答案:

答案 0 :(得分:3)

for j in length(words[[1]])没有按照您的预期行事; j仅等于列表的全长。这也意味着j + 1在列表末尾运行(以便words[[1]][j + 1]返回NA)。

for循环线更改为

        for (j in seq_len(length(words[[1]]) - 1)) {

现在

getAssonanceScore("babbling brook by blue grass", 0)

返回3.

正如评论中所指出的那样,更好,计算更有效,更简洁的方法

all_words <- unlist(strsplit(book, " "))
count <- sum(substr(head(all_words, -1), 1, 1) ==
             substr(tail(all_words, -1), 1, 1))