【问题标题】:Count correct Output in nested loops, with nested ifelse使用嵌套 ifelse 计算嵌套循环中的正确输出
【发布时间】:2016-11-19 11:10:32
【问题描述】:

几天来,我试图为嵌套 ifelse 和嵌套循环的组合获得正确计数的输出。我想要么我的嵌套完全错误,要么我尝试计算输出的方式,也许两者兼而有之。

ifelse.1 = function(input_matrix) {

  result = 1
  output = 0
  sum_output = 0

  for(i in 1:dim(input_matrix)[1]){
    for(j in 1:dim(word_list_matrix-one)[1]){
      for(k in 1:dim(word_list_matrix_two)[1]){

  ifelse(str_detect(input_matrix[i], ("word")) == TRUE 
  &  str_detect(input_matrix[i], word_list_matrix_one[j]) == TRUE
     &  str_detect(input_matrix[i], word_list_matrix_two[k]) == TRUE,
           output[i] <- output[i] + result, 
  ifelse(
     str_detect(input_matrix[i], word_list_matrix_three[j]) == TRUE
     &  str_detect(input_matrix[i], word_list_matrix_two[k]) == FALSE,
           output[i] <- output[i] + result, NA))

        sum_output = output[i]
    } # k-loop
  } # j-loop
} # i-loop
  return(sum_output)
}

该代码是关于在多个单列矩阵的多行中检测某些字符串(通过包stringrstr_detect 函数)。 所以在input_matrix 的第一个row [i] 中,应该检测到word_list_matrixrow [j] 给出的字符串。

只要上面提到的 ifelse 之一为真,就应该在输出中添加 +1,在所有 i 个周期结束时,应该返回输出的总和。

问题是我得到NA 作为答案,或者(对于此代码的某些变体)我得到的输出计数多于我输入的输入。

我知道 ifelse 应该能够计算向量,这可能会导致不需要循环,但尽管我从来没有这样工作,但我必须计算的矩阵长度不同。

我希望我设法提供了一个具有足够细节的良好、可重复的问题。 非常感谢您的宝贵时间。

【问题讨论】:

  • 澄清一下,您想要检测和计算input_matrix 中的元素数量,其中包含包含all 您的word_list_matrix_N 中的单词的文本序列变量。对吗?
  • 您似乎正试图为每个 if 语句增加一个 output 的值。如果是这样,您需要每次都引用output,否则您会要求 R 寻找不同的值。通过尝试使用output[i] 调用它,您要求 R 每次都找到一个不同的值,看起来您希望相同的值继续计数。所以使用output 而不是output[i]
  • @JaimeCR 说得对,如果检测到 word_list_matrix_1 中的一个词,则还要从 word_list_matrix_2 中搜索另一个词,依此类推
  • @rosscova 有点向前迈进了一步,而不是简单地返回 NA 现在他给出了一个应该是的数字,但不是预期的数字。对于预期提供 3 个结果的数据样本,该函数提供 15 的输出

标签: r


【解决方案1】:

你可以用这个。

one <- as.data.frame(apply(df, 2, function(x) {
    str_detect(x, paste(word_list_matrix, sep = '|', collapse = '|'))
}))

two <- as.data.frame(apply(df, 2, function(x) {
  str_detect(x, paste(word_list_matrix_two, sep = '|', collapse = '|'))
}))

three <- as.data.frame(apply(df, 2, function(x) {
  str_detect(x, paste(word_list_matrix_three, sep = '|', collapse = '|'))
}))

which(one & two & three, TRUE)

结果将是原始矩阵中元素的行号和列号,其中包含所有三个 word_list 中的至少一个单词。如果您想检查另一个条件,例如该单词是否属于列表 1 && 2 ||清单 3,您可以相应地更改最后一行,例如

which(one & two | three, TRUE)

【讨论】:

  • 非常感谢您,这很好用!是否还有可能检查条件一而不是二?我试图用 !而不是 & 但它不起作用,猜测是 wring 语法
  • 我刚刚再次检查了我的数据,我真的需要设置 NO 条件才能使其工作,否则代码将多次计算几行。如果不能实现 NO 条件,也许可以排除在 | 中的一和二中发现为真的行。首先被搜索的三个条件
  • 您可以使用! 运算符来设置NO 条件。例如,!(one) 获取第一个列表中不包含单词的单元格。您还可以使用不同的组合,例如!(one | two) &amp; three.
  • 这三个词表的哪个条件你要具体检查?
  • 特别是我必须测试哪个(一和二和三 | 一和四不是三)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
相关资源
最近更新 更多