【问题标题】:Error: missing value where True/False错误:缺少 True/False 的值
【发布时间】:2016-07-27 15:18:43
【问题描述】:

我正在尝试删除列表中带有“.dsw”标签的所有值。我的列表是使用函数list.files 的文件列表。这是我的代码:

for (file in GRef) {
  if (strsplit(file, "[.]")[[1]][3] == "dsw") {
     #GRef=GRef[-file]
    for(n in 1:length(GRef)){
      if (GRef[n] == file){
        GRef=GRef[-n]
      }
    }
  }
}

其中 GRef 是文件名列表。我收到上面列出的错误,但我不明白为什么。我看过这个帖子:Error .. missing value where TRUE/FALSE needed,但我认为不是一回事。

【问题讨论】:

  • 请提供更多细节:在GRef中显示内容示例。
  • 你可能在第一个外部if 语句中有一个 NA。在打印等式左侧的if 之前调用print
  • 这可能是因为文件中只有一个 .,这意味着将其索引为 3 将超出范围

标签: r list strsplit


【解决方案1】:

您不应该在循环遍历矢量时尝试修改它。问题是您正在删除您稍后尝试提取的项目,这导致了缺失值。最好先确定要删除的所有项目,然后再删除它们。例如

GRef <- c("a.file.dsw", "b.file.txt", "c.file.gif", "d.file.dsw")
exts <- sapply(strsplit(GRef, "[.]"), `[`, 3)
GRef <- GRef[exts!="dsw"]

【讨论】:

  • 这在大多数情况下都有效。你能解释一下使用的语法吗? (即为什么使用 sapply(strsplit(GRef,"[.]"),[,3) 编辑:我的主要误解是[。那有什么作用?
  • strsplit 返回一个列表。 sapply 迭代该列表,[ 是子集函数,因此它从列表中的每个向量中提取第三个元素。
猜你喜欢
  • 2019-02-25
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2011-11-13
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多